- Fórum
- Protheus/Microsiga/Totvs
- AdvPL (Advanced Protheus Language)
- Dúvidas Gerais
- Desenvolvimento Relatório Fornecedores x Nro de Notas de Entrada
×
Linguagem de Programação ADVPL
Perguntas Desenvolvimento Relatório Fornecedores x Nro de Notas de Entrada
- jazz_narba
- Autor do Tópico
- Desconectado
- Membro Iniciado
Menos
Mais
- Postagens: 2
- Obrigados Recebidos: 0
11 anos 1 mês atrás #17686
por jazz_narba
Senhores ..Bom Dia ...
Estou tentando desenvolver um relatório que me exiba os Fornecedores e o total desuas referidas Notas de Entrada, e esta exibindo o erro de Type Mismatch on =+. Verifiquei os comparadores com os campos das tabelas, não consegui encontrar nada, alguém poderia por favor dar uma olhada rápida no fonte ??? Abraços a todos
// PASSO 00 - Trocar o include por Protheus.ch
#INCLUDE "protheus.ch"
// PASSO 01 - dar um nome pra User
User Function Exer01
// PASSO 02 - Preencher as variáveis abaixo
// Descrição, Título
Local cDesc1 := "FORNECEDOR x NUMERO DE NOTAS DE ENTRADA"
Local cDesc2 := "As colunas constam no Slide. Relatório com QUERY."
Local cDesc3 := "FORNECEDOR x NUMERO DE NOTAS DE ENTRADA"
Local cPict := ""
Local titulo := "FORNECEDOR x NUMERO DE NOTAS DE ENTRADA"
Local nLin := 80
// PASSO 03 - Montar as variáveis Cabec1 e Cabec2
// Baseiar-se no Layout fornecido pelo Cliente (MIT044)
// 0 1 2 3 4 5 6 7
// 01234567890123456789012345678901234567890123456789012345678901234567890123456789
Local Cabec1 := "Municipio Natureza Transportadora "
Local Cabec2 := "=============== ========== ====== "
Local imprime := .T.
Local aOrd := {}
Private lEnd := .F.
Private lAbortPrint := .F.
Private CbTxt := ""
// PASSO 04 - Definir o Tamanho (PMG) alterando 'limite' x 'tamanho'
// e a variável nomeprog
// Considere as seguintes relações:
// P - 80
// M - 132
// G - 232
Private limite := 80
Private tamanho := "P"
Private nomeprog := "Exer01"
Private nTipo := 18
Private aReturn := { "Zebrado", 1, "Administracao", 2, 2, 1, "", 1}
Private nLastKey := 0
// PASSO 05
// Definir o nome do Grupo de Perguntas SX1 em cPerg
Private cPerg := PadR("Exer01", Len(SX1->X1_GRUPO), " ")
Private cbtxt := Space(10)
Private cbcont := 00
Private CONTFL := 01
Private m_pag := 01
// PASSO 06 - Alterar o conteúdo da variável wnrel
// que será o nome do arquivo gravado em SPOOL
Private wnrel := "Exer01" // nomeprog Nome do relatório na pasta SPOOL
Private cString := "SA2"
// PASSO 07
// Criar uma função que grave essas pergunta automaticamente
// A função GravaSX1 está na parte final do fonte e precisa de adaptações
GravaSX1(cPerg)
// PASSO 08 - Conferir o conteúdo de cString e colocar o nome da tabela principal
// Escolha o índice preenchendo o número em DbSetOrder
// Aproveite pra documentar a chave do índice colocando os campos que a compõem
dbSelectArea(cString)
dbSetOrder(1) // A2_FILIAL+A2_CODIGO
pergunte(cPerg,.F.)
//ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
//³ Monta a interface padrao com o usuario... ³
//ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
wnrel := SetPrint(cString,NomeProg,cPerg,@titulo,cDesc1,cDesc2,cDesc3,.T.,aOrd,.T.,Tamanho,,.T.)
If nLastKey == 27
Return
Endif
SetDefault(aReturn,cString)
If nLastKey == 27
Return
Endif
nTipo := If(aReturn[4]==1,15,18)
RptStatus({|| RunReport(Cabec1,Cabec2,Titulo,nLin) },Titulo)
Return
*
Static Function RunReport(Cabec1,Cabec2,Titulo,nLin)
Local nOrdem
// Passo Query 00 - definicao das variaveis da Query
Local cQuery := ""
Local cQryS := ""
Local cQryF := ""
Local cQryW := ""
Local cQryO := ""
Local cQryG := ""
Private cCpoFil := ""
cString := GetNextAlias()
// Passo Query 01 - Montar a query do COUNT
cQryS += "SELECT COUNT(*) TOTAL "
cQryF += "FROM "+RetSqlName("SA2")+ " SA2 "
cQryF += "LEFT JOIN "+RetSqlName("SF1")+ " SF1 " + "ON "
cQryF += " A2_COD = F1_FORNECE AND "
cQryF += " F1_FILIAL = '"+xFilial("SF1")+"' AND "
cQryF += " SF1.D_E_L_E_T_ = ' ' AND "
cQryW += " F1_FORNECE >= '" + MV_PAR03 + "' AND "
cQryW += " F1_FORNECE <= '" + MV_PAR04 + "' "
cQryW += "WHERE SF1.D_E_L_E_T_ = ' ' AND "
cQryW += " F1_FILIAL = '"+xFilial("SF1")+"' AND "
cQryW += " F1_EMISSAO >= '" + MV_PAR01 + "' AND "
cQryW += " F1_EMISSAO <= '" + MV_PAR02 + "' "
cQuery := ChangeQuery( cQryS + cQryF + cQryW + cQryO + cQryG )
// Passo Query 02 - Executar e abrir a query do COUNT
dbUseArea( .T., 'TOPCONN', TCGENQRY(,,cQuery), cString , .F., .T.)
SetRegua( (cString)->TOTAL )
// Passo Query 03 - Fechar a área
DbCloseArea(cString)
// Passo Query 04 - Redefinir a parte do Select e do Order By
cQryS := "SELECT A2_MUN, A2_NATUREZ, A2_TRANSP "
cQryO := "ORDER BY A2_COD"
cQuery := ChangeQuery( cQryS + cQryF + cQryW + cQryO + cQryG )
// Passo Query 05 - Executar e abrir a query do COUNT
dbUseArea( .T., 'TOPCONN', TCGENQRY(,,cQuery), cString , .F., .T.)
nTotal := 0
nQtd := 0
// [1] - Codigo da Natureza [2] - Valor Total da Natureza (Acumulado)
aResumo := {}
// PASSO 10 - Complementar as condições de Saída do While
While !(cString)->( EOF() )
If lAbortPrint
@nLin,00 PSAY "*** CANCELADO PELO OPERADOR ***"
Exit
Endif
If nLin > 55 // Salto de Página. Neste caso o formulario tem 55 linhas...
Cabec(Titulo,Cabec1,Cabec2,NomeProg,Tamanho,nTipo)
nLin := 9
Endif
// Passo 12
// Colocar os campos e as posições de Impressão
// nLin é a Linha e o próximo dado é a coluna
// Comece sempre na 00
@nLin,00 PSAY (cString)->A2_MUN
@nLin,07 PSAY (cString)->A2_NATUREZ
@nLin,26 PSAY (cString)->A2_TRANSP
// Parte do Resumo
nPos := AScan(aResumo, {|x| x[1] == (cString)->A2_NATUREZ } )
If nPos == 0
// [1] - Codigo da Natureza [2] - Valor Total da Natureza (Acumulado)
Aadd( aResumo, { (cString)->A2_NATUREZ, (cString)->A2_TRANSP } )
Else
aResumo[nPos][2] += (cString)->A2_TRANSP
EndIf
// Passo 13
// Descomentar as linhas abaixo se quiser controlar
// quantidade de linhas impressas (nQtd)
// nQtd++ // nQtd += 1 ou nQtd := nQtd + 1
// Passo 14
// Descomentar as linhas abaixo se quiser controlar
// total de uma coluna impressa (nTotal)
// Se quiser controlar o total de uma coluna deve
// substituir o campo B1_PRV1 pelo campo desejado
nTotal += (cString)->A2_TRANSP
nLin := nLin + 1 // Avanca a linha de impressao
(cString)->( dbSkip() ) // Avanca o ponteiro do registro no arquivo
EndDo
// Passo 15
// Descomentar as linhas abaixo se quiser que seja impresso o total de linhas
// @nLin,00 PSAY "Qtd Linhas: "+AllTrim(Str(nQtd))
// Passo 16
// Descomentar as linhas abaixo se quiser que seja impresso o valor total da coluna
// Mudar o "53" e a Máscara abaixo conforme a coluna que estiver sendo controlada
//@nLin,61 PSAY nTotal Picture "@E 9,999,999,999.99"
//nLin := nLin + 2 // Avanca a linha de impressao
//If nLin > 55 // Salto de Página. Neste caso o formulario tem 55 linhas...
// Cabec(Titulo,Cabec1,Cabec2,NomeProg,Tamanho,nTipo)
// nLin := 9
//Endif
// Impressão do Valor Acumulado
//ASort(aResumo, , , {|x,y| x[1] < y[1] } )
//For nI := 1 To Len(aResumo)
// @nLin,00 PSAY aResumo[nI][1]
// @nLin,61 PSAY aResumo[nI][2] Picture "@E 9,999,999,999.99"
// nLin := nLin + 1 // Avanca a linha de impressao
// If nLin > 55 // Salto de Página. Neste caso o formulario tem 55 linhas...
// Cabec(Titulo,Cabec1,Cabec2,NomeProg,Tamanho,nTipo)
// nLin := 9
// Endif
//Next nI
//SET DEVICE TO SCREEN
//ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
//³ Se impressao em disco, chama o gerenciador de impressao... ³
//ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
If aReturn[5]==1
dbCommitAll()
SET PRINTER TO
OurSpool(wnrel)
Endif
MS_FLUSH()
Return
*
Static Function GravaSX1(cPerg)
// PASSO 07
// Defina as perguntas que irá filtrar seu relatório
// Este passo está intimamente ligado ao Passo 11
Local aPerguntas := {}
Local aSX1Cpos := {}
DbSelectArea("SX1")
DbGoTop()
cPerg := PadR(cPerg, Len(SX1->X1_GRUPO), " ")
// Não alterar aSX1Cpos
aSX1Cpos := {"X1_GRUPO","X1_ORDEM","X1_PERGUNT" ,"X1_VARIAVL","X1_TIPO","X1_TAMANHO","X1_DECIMAL","X1_PRESEL","X1_GSC","X1_VAR01","X1_DEF01" ,"X1_CNT01" ,"X1_DEF02" ,"X1_DEF03" ,"X1_DEF04" ,"X1_F3","X1_HELP"}
// Deve ter uma linha pra cada pergunta
Aadd(aPerguntas,{cPerg ,"01" ,"Fornecedor De: " ,"mv_ch1" ,"C" ,06 ,0 ,0 ,"G" ,"MV_PAR03","" ,Space(06) ,"" ,"" ,"" ,"SA2" ,"" })
Aadd(aPerguntas,{cPerg ,"02" ,"Fornecedor Até: " ,"mv_ch2" ,"C" ,06 ,0 ,0 ,"G" ,"MV_PAR04","" ,Replicate("Z",06),"" ,"" ,"" ,"SA2" ,"" })
Aadd(aPerguntas,{cPerg ,"03" ,"Emissao De: " ,"mv_ch3" ,"C" ,10 ,0 ,0 ,"G" ,"MV_PAR01","" ,Space(10) ,"" ,"" ,"" ,"SF1" ,"" })
Aadd(aPerguntas,{cPerg ,"04" ,"Enissao Até: " ,"mv_ch4" ,"C" ,10 ,0 ,0 ,"G" ,"MV_PAR02","" ,Replicate("Z",10),"" ,"" ,"" ,"SF1" ,"" })
//For nI:=1 to Len(aPerguntas)
// If DbSeek( aPerguntas[nI,1] + aPerguntas[nI,2] )
// RecLock("SX1",.F.)
// Else
// RecLock("SX1",.T.)
// EndIf
// For nJ:=1 to Len( aPerguntas[nI] )
// FieldPut( FieldPos( aSX1Cpos[nJ]) , aPerguntas[nI,nJ] )
// Next
// SX1->( MsUnLock() )
//Next nI
Return
Estou tentando desenvolver um relatório que me exiba os Fornecedores e o total desuas referidas Notas de Entrada, e esta exibindo o erro de Type Mismatch on =+. Verifiquei os comparadores com os campos das tabelas, não consegui encontrar nada, alguém poderia por favor dar uma olhada rápida no fonte ??? Abraços a todos
// PASSO 00 - Trocar o include por Protheus.ch
#INCLUDE "protheus.ch"
// PASSO 01 - dar um nome pra User
User Function Exer01
// PASSO 02 - Preencher as variáveis abaixo
// Descrição, Título
Local cDesc1 := "FORNECEDOR x NUMERO DE NOTAS DE ENTRADA"
Local cDesc2 := "As colunas constam no Slide. Relatório com QUERY."
Local cDesc3 := "FORNECEDOR x NUMERO DE NOTAS DE ENTRADA"
Local cPict := ""
Local titulo := "FORNECEDOR x NUMERO DE NOTAS DE ENTRADA"
Local nLin := 80
// PASSO 03 - Montar as variáveis Cabec1 e Cabec2
// Baseiar-se no Layout fornecido pelo Cliente (MIT044)
// 0 1 2 3 4 5 6 7
// 01234567890123456789012345678901234567890123456789012345678901234567890123456789
Local Cabec1 := "Municipio Natureza Transportadora "
Local Cabec2 := "=============== ========== ====== "
Local imprime := .T.
Local aOrd := {}
Private lEnd := .F.
Private lAbortPrint := .F.
Private CbTxt := ""
// PASSO 04 - Definir o Tamanho (PMG) alterando 'limite' x 'tamanho'
// e a variável nomeprog
// Considere as seguintes relações:
// P - 80
// M - 132
// G - 232
Private limite := 80
Private tamanho := "P"
Private nomeprog := "Exer01"
Private nTipo := 18
Private aReturn := { "Zebrado", 1, "Administracao", 2, 2, 1, "", 1}
Private nLastKey := 0
// PASSO 05
// Definir o nome do Grupo de Perguntas SX1 em cPerg
Private cPerg := PadR("Exer01", Len(SX1->X1_GRUPO), " ")
Private cbtxt := Space(10)
Private cbcont := 00
Private CONTFL := 01
Private m_pag := 01
// PASSO 06 - Alterar o conteúdo da variável wnrel
// que será o nome do arquivo gravado em SPOOL
Private wnrel := "Exer01" // nomeprog Nome do relatório na pasta SPOOL
Private cString := "SA2"
// PASSO 07
// Criar uma função que grave essas pergunta automaticamente
// A função GravaSX1 está na parte final do fonte e precisa de adaptações
GravaSX1(cPerg)
// PASSO 08 - Conferir o conteúdo de cString e colocar o nome da tabela principal
// Escolha o índice preenchendo o número em DbSetOrder
// Aproveite pra documentar a chave do índice colocando os campos que a compõem
dbSelectArea(cString)
dbSetOrder(1) // A2_FILIAL+A2_CODIGO
pergunte(cPerg,.F.)
//ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
//³ Monta a interface padrao com o usuario... ³
//ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
wnrel := SetPrint(cString,NomeProg,cPerg,@titulo,cDesc1,cDesc2,cDesc3,.T.,aOrd,.T.,Tamanho,,.T.)
If nLastKey == 27
Return
Endif
SetDefault(aReturn,cString)
If nLastKey == 27
Return
Endif
nTipo := If(aReturn[4]==1,15,18)
RptStatus({|| RunReport(Cabec1,Cabec2,Titulo,nLin) },Titulo)
Return
*
Static Function RunReport(Cabec1,Cabec2,Titulo,nLin)
Local nOrdem
// Passo Query 00 - definicao das variaveis da Query
Local cQuery := ""
Local cQryS := ""
Local cQryF := ""
Local cQryW := ""
Local cQryO := ""
Local cQryG := ""
Private cCpoFil := ""
cString := GetNextAlias()
// Passo Query 01 - Montar a query do COUNT
cQryS += "SELECT COUNT(*) TOTAL "
cQryF += "FROM "+RetSqlName("SA2")+ " SA2 "
cQryF += "LEFT JOIN "+RetSqlName("SF1")+ " SF1 " + "ON "
cQryF += " A2_COD = F1_FORNECE AND "
cQryF += " F1_FILIAL = '"+xFilial("SF1")+"' AND "
cQryF += " SF1.D_E_L_E_T_ = ' ' AND "
cQryW += " F1_FORNECE >= '" + MV_PAR03 + "' AND "
cQryW += " F1_FORNECE <= '" + MV_PAR04 + "' "
cQryW += "WHERE SF1.D_E_L_E_T_ = ' ' AND "
cQryW += " F1_FILIAL = '"+xFilial("SF1")+"' AND "
cQryW += " F1_EMISSAO >= '" + MV_PAR01 + "' AND "
cQryW += " F1_EMISSAO <= '" + MV_PAR02 + "' "
cQuery := ChangeQuery( cQryS + cQryF + cQryW + cQryO + cQryG )
// Passo Query 02 - Executar e abrir a query do COUNT
dbUseArea( .T., 'TOPCONN', TCGENQRY(,,cQuery), cString , .F., .T.)
SetRegua( (cString)->TOTAL )
// Passo Query 03 - Fechar a área
DbCloseArea(cString)
// Passo Query 04 - Redefinir a parte do Select e do Order By
cQryS := "SELECT A2_MUN, A2_NATUREZ, A2_TRANSP "
cQryO := "ORDER BY A2_COD"
cQuery := ChangeQuery( cQryS + cQryF + cQryW + cQryO + cQryG )
// Passo Query 05 - Executar e abrir a query do COUNT
dbUseArea( .T., 'TOPCONN', TCGENQRY(,,cQuery), cString , .F., .T.)
nTotal := 0
nQtd := 0
// [1] - Codigo da Natureza [2] - Valor Total da Natureza (Acumulado)
aResumo := {}
// PASSO 10 - Complementar as condições de Saída do While
While !(cString)->( EOF() )
If lAbortPrint
@nLin,00 PSAY "*** CANCELADO PELO OPERADOR ***"
Exit
Endif
If nLin > 55 // Salto de Página. Neste caso o formulario tem 55 linhas...
Cabec(Titulo,Cabec1,Cabec2,NomeProg,Tamanho,nTipo)
nLin := 9
Endif
// Passo 12
// Colocar os campos e as posições de Impressão
// nLin é a Linha e o próximo dado é a coluna
// Comece sempre na 00
@nLin,00 PSAY (cString)->A2_MUN
@nLin,07 PSAY (cString)->A2_NATUREZ
@nLin,26 PSAY (cString)->A2_TRANSP
// Parte do Resumo
nPos := AScan(aResumo, {|x| x[1] == (cString)->A2_NATUREZ } )
If nPos == 0
// [1] - Codigo da Natureza [2] - Valor Total da Natureza (Acumulado)
Aadd( aResumo, { (cString)->A2_NATUREZ, (cString)->A2_TRANSP } )
Else
aResumo[nPos][2] += (cString)->A2_TRANSP
EndIf
// Passo 13
// Descomentar as linhas abaixo se quiser controlar
// quantidade de linhas impressas (nQtd)
// nQtd++ // nQtd += 1 ou nQtd := nQtd + 1
// Passo 14
// Descomentar as linhas abaixo se quiser controlar
// total de uma coluna impressa (nTotal)
// Se quiser controlar o total de uma coluna deve
// substituir o campo B1_PRV1 pelo campo desejado
nTotal += (cString)->A2_TRANSP
nLin := nLin + 1 // Avanca a linha de impressao
(cString)->( dbSkip() ) // Avanca o ponteiro do registro no arquivo
EndDo
// Passo 15
// Descomentar as linhas abaixo se quiser que seja impresso o total de linhas
// @nLin,00 PSAY "Qtd Linhas: "+AllTrim(Str(nQtd))
// Passo 16
// Descomentar as linhas abaixo se quiser que seja impresso o valor total da coluna
// Mudar o "53" e a Máscara abaixo conforme a coluna que estiver sendo controlada
//@nLin,61 PSAY nTotal Picture "@E 9,999,999,999.99"
//nLin := nLin + 2 // Avanca a linha de impressao
//If nLin > 55 // Salto de Página. Neste caso o formulario tem 55 linhas...
// Cabec(Titulo,Cabec1,Cabec2,NomeProg,Tamanho,nTipo)
// nLin := 9
//Endif
// Impressão do Valor Acumulado
//ASort(aResumo, , , {|x,y| x[1] < y[1] } )
//For nI := 1 To Len(aResumo)
// @nLin,00 PSAY aResumo[nI][1]
// @nLin,61 PSAY aResumo[nI][2] Picture "@E 9,999,999,999.99"
// nLin := nLin + 1 // Avanca a linha de impressao
// If nLin > 55 // Salto de Página. Neste caso o formulario tem 55 linhas...
// Cabec(Titulo,Cabec1,Cabec2,NomeProg,Tamanho,nTipo)
// nLin := 9
// Endif
//Next nI
//SET DEVICE TO SCREEN
//ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
//³ Se impressao em disco, chama o gerenciador de impressao... ³
//ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
If aReturn[5]==1
dbCommitAll()
SET PRINTER TO
OurSpool(wnrel)
Endif
MS_FLUSH()
Return
*
Static Function GravaSX1(cPerg)
// PASSO 07
// Defina as perguntas que irá filtrar seu relatório
// Este passo está intimamente ligado ao Passo 11
Local aPerguntas := {}
Local aSX1Cpos := {}
DbSelectArea("SX1")
DbGoTop()
cPerg := PadR(cPerg, Len(SX1->X1_GRUPO), " ")
// Não alterar aSX1Cpos
aSX1Cpos := {"X1_GRUPO","X1_ORDEM","X1_PERGUNT" ,"X1_VARIAVL","X1_TIPO","X1_TAMANHO","X1_DECIMAL","X1_PRESEL","X1_GSC","X1_VAR01","X1_DEF01" ,"X1_CNT01" ,"X1_DEF02" ,"X1_DEF03" ,"X1_DEF04" ,"X1_F3","X1_HELP"}
// Deve ter uma linha pra cada pergunta
Aadd(aPerguntas,{cPerg ,"01" ,"Fornecedor De: " ,"mv_ch1" ,"C" ,06 ,0 ,0 ,"G" ,"MV_PAR03","" ,Space(06) ,"" ,"" ,"" ,"SA2" ,"" })
Aadd(aPerguntas,{cPerg ,"02" ,"Fornecedor Até: " ,"mv_ch2" ,"C" ,06 ,0 ,0 ,"G" ,"MV_PAR04","" ,Replicate("Z",06),"" ,"" ,"" ,"SA2" ,"" })
Aadd(aPerguntas,{cPerg ,"03" ,"Emissao De: " ,"mv_ch3" ,"C" ,10 ,0 ,0 ,"G" ,"MV_PAR01","" ,Space(10) ,"" ,"" ,"" ,"SF1" ,"" })
Aadd(aPerguntas,{cPerg ,"04" ,"Enissao Até: " ,"mv_ch4" ,"C" ,10 ,0 ,0 ,"G" ,"MV_PAR02","" ,Replicate("Z",10),"" ,"" ,"" ,"SF1" ,"" })
//For nI:=1 to Len(aPerguntas)
// If DbSeek( aPerguntas[nI,1] + aPerguntas[nI,2] )
// RecLock("SX1",.F.)
// Else
// RecLock("SX1",.T.)
// EndIf
// For nJ:=1 to Len( aPerguntas[nI] )
// FieldPut( FieldPos( aSX1Cpos[nJ]) , aPerguntas[nI,nJ] )
// Next
// SX1->( MsUnLock() )
//Next nI
Return
Por favor Acessar ou Registrar para participar da conversa.
- Fórum
- Protheus/Microsiga/Totvs
- AdvPL (Advanced Protheus Language)
- Dúvidas Gerais
- Desenvolvimento Relatório Fornecedores x Nro de Notas de Entrada
Tempo para a criação da página:0.100 segundos