Imprimi Página | Fechar janela

Erro query

Impresso de: Helpfacil - Portal do conhecimento
Nome do Forum: ADVPL
Descrição do Forum: Dúvidas sobre a programação em ADVPL
URL:http://www.helpfacil.com.br/display_topic_threads.asp?ForumID=1&TopicID=43421
Data da Impressão: quinta-feira, 28 de março de 2024 at 20:57


Topico: Erro query

Postado por: ROMERO_BR
Assunto: Erro query
Data Postagem: sexta-feira, 9 de outubro de 2020 at 09:34

Bruno Romero

Olá.
Estou com um erro na execução de uma query. Segue o fonte:

Static function areserv()

LOCAL     cNUMERO      := GetSxeNum("SC0","C0_NUM")
LOCAL     cQuerysc6     := ""   
LOCAL     cQuerysc0     := ""
LOCAL      lRet          := .F.
            
aAreax := GetArea()
cQuerysc0 := " SELECT COUNT(C0_NUM)AS COUNT "
cQuerysc0 += " FROM " + RetSQLName("SC0")+" SC0 "
cQuerysc0 += " WHERE SC0.C0_DOCRES = ‘" + SC6->C6_NUM + "‘ "
cQuerysc0 += " AND SC0.D_E_L_E_T_ = ‘‘ "
cQuerysc0 := ChangeQuery(cQuerysc0)
DbUseArea(.T., "TOPCONN", TCGenQry(,,cQuerysc0), ‘TSC0‘, .F., .T.)
     
IF TSC0->COUNT = 0
lRet := .T.
ENDIF
TSC0->(dbCloseArea())
         
RestArea(aAreax)
   
cQuerysc6 := "SELECT C6_ITEM, C6_PRODUTO, C6_QTDVEN, C6_LOCAL, C6_NUM, C6_RESERVA, C6_XOBSERV,C6_LOCALIZ,C6_NUMSERI "
cQuerysc6 += "FROM " + RetSqlName( "SC6" ) + " SC6 "
cQuerysc6 += "WHERE SC6.C6_NUM = ‘" +SC6->C6_NUM + "‘ "
cQuerysc6 += "ORDER BY SC6.C6_ITEM"      
          
DbUseArea(.T., "TOPCONN", TCGenQry(,,cQuerysc6), ‘TSC6‘, .F., .T.)     
                                                       
             
While !TSC6->(Eof())     
IF lRet
             
aOPERACAO := {1,"PD",TSC6->C6_NUM,AllTrim(cUserName),xFilial("SC6"),AllTrim(TSC6->C6_XOBSERV)}
cPRODUTO:= TSC6->C6_PRODUTO
cLOCAL := TSC6->C6_LOCAL
nQUANT := TSC6->C6_QTDVEN
aLOTE   := {"","",TSC6->C6_LOCALIZ,TSC6->C6_NUMSERI}
                                                              
                                      A430Reserv(aOPERACAO,cNUMERO,cPRODUTO,cLOCAL,nQUANT,aLOTE)
                                       
dbSelectArea("SC6")
dbSetorder(1)
dbSeek(xFilial("SC6")+TSC6->C6_NUM+TSC6->C6_ITEM+TSC6->C6_PRODUTO)
                                             Reclock("SC6",.F.)
SC6->C6_RESERVA := cNUMERO         
SC6->(MsUnlock())                                                       
SC6->(dbCloseArea())               
                                        
ENDIF
TSC6->(dbSkip())
Enddo
TSC6->(dbCloseArea())

   
Return


O erro ocorre na query cQuerysco pois nao traz o valor correto da quantidade de registro, ou seja o TSC0->COUNT traz sempre o valor de 0. Quando realizo essa query MSTUDIO do SQLServer traz o resultado corretamente de valor 2. Fiz um teste sem cQuerysc0 += " AND SC0.D_E_L_E_T_ = ‘‘ " e o TSC0->COUNT trouxe o resultado correto porem sei que preciso dessa clausula. Alguma idéia do que pode ser este erro?



Respostas:

Postado Por: EMERSON.EN
Data Postagem: sexta-feira, 9 de outubro de 2020 at 16:31

Bobagem, mas não custa tentar...
No lugar de apelidar o campo de COUNT, chame-o de QTD ou NUMREG ou qualquer outro nome que não seja uma palavra reservada.



Postado Por: ROMERO_BR
Data Postagem: quinta-feira, 15 de outubro de 2020 at 09:16

Bruno Romero

Realizei a alteração removendo a palavra reservada da query porem o erro persiste.
                cQuerysc0 := " SELECT COUNT(C0_NUM)AS QUAN "
                cQuerysc0 += " FROM " + RetSQLName("SC0")+" SC0 "
                cQuerysc0 += " WHERE SC0.C0_DOCRES = ‘" + cPedido + "‘ "
                cQuerysc0 += " AND SC0.R_E_C_N_O_ <> SC0.R_E_C_D_E_L_ "
                cQuerysc0 := ChangeQuery(cQuerysc0)

Quando eu debugo a query armazenada de cQuerysc0 funciona. Alguma outra idéia?





Postado Por: RPERICO
Data Postagem: quinta-feira, 15 de outubro de 2020 at 10:41

bom dia

Tente gravar o resultado da query em uma pasta e depois executar ela no SQL Studio para ver como sua rotina está montando. Talvez ajude na solução do problema.

Grava resultado da query em arquivo texto
--------------------------------------------*/
MemoWrit("\Query_Temp\nome do arquivo.sql", cQuerysc0)

Abraço




Postado Por: CJ_CAMPOS
Data Postagem: quinta-feira, 15 de outubro de 2020 at 10:44

Vc não se esqueceu de tirar no TSC6 os registros "deletados" do SC6 ?



Postado Por: INFOBRENO
Data Postagem: quinta-feira, 15 de outubro de 2020 at 10:55

cQuerysc0 := ChangeQuery(cQuerysc0) <-- AUI PODE RETIRAR DBUSEAREA NÃO PRECISA
DbUseArea(.T., "TOPCONN", TCGenQry(,,cQuerysc0), 'TSC0', .F., .T.)

cQuerysc0 := " SELECT COUNT(C0_NUM)AS COUNT "
TENTA TROCAR POR
cQuerysc0 := " SELECT COUNT(*) NREG "



Postado Por: EMERSON.EN
Data Postagem: quinta-feira, 15 de outubro de 2020 at 11:16

tente assim:
Static function areserv()
LOCAL cNUMERO
LOCAL cQuerysc6          := ""
LOCAL cQuerysc0          := ""
LOCAL lRet               := .F.
LOCAL aAreax          := GetArea()
LOCAL cNumPedido     := SC6->C6_NUM

     if SELECT(‘TSC0‘) > 0
          TSC0->(dbCloseArea())
     endif

     BeginSQL Alias ‘TSC0‘
          SELECT COUNT(C0_NUM) AS QTD
          FROM %table:SC0%
          WHERE %notdel% AND C0_FILIAL = %xFilial:SC0%
          AND C0_DOCRES = %exp:cNumPedido%
     EndSQL
     lRet := (TSC0->QTD = 0)
     TSC0->(dbCloseArea())

     If lRet

          if SELECT(‘TSC6‘) > 0
               TSC6->(dbCloseArea())
          endif

          BeginSQL Alias ‘TSC6‘
               SELECT C6_ITEM, C6_PRODUTO, C6_QTDVEN, C6_LOCAL,
                    C6_NUM, C6_RESERVA, C6_XOBSERV, C6_LOCALIZ, C6_NUMSERI
               FROM %table:SC6%
               WHERE %notdel% AND C6_FILIAL = %xFilial:SC6%
               AND C6_NUM = %exp:cNumPedido%
               ORDER C6_ITEM
          EndSQL

          SC6->(dbSetorder(1)) // C6_FILIAL, C6_NUM, C6_ITEM, C6_PRODUTO
          cNUMERO     := GetSxeNum("SC0","C0_NUM")
          cFilSC6 := xFilial("SC6") // melhora a performance porque chama a função uma única vez

          While !TSC6->(Eof())
               aOPERACAO     := {1, "PD", TSC6->C6_NUM, AllTrim(cUserName), cFilSC6, AllTrim(TSC6->C6_XOBSERV)}
               cPRODUTO     := TSC6->C6_PRODUTO
               cLOCAL          := TSC6->C6_LOCAL
               nQUANT          := TSC6->C6_QTDVEN
               aLOTE          := {"" ,"", TSC6->C6_LOCALIZ, TSC6->C6_NUMSERI}
               A430Reserv(aOPERACAO, cNUMERO, cPRODUTO, cLOCAL, nQUANT, aLOTE)

               If SC6->(dbSeek(cFilSC6+TSC6->C6_NUM+TSC6->C6_ITEM+TSC6->C6_PRODUTO))
                    Reclock("SC6",.F.)
                    SC6->C6_RESERVA := cNUMERO
                    SC6->(MsUnlock())
                    //SC6->(dbCloseArea()) // EVITE FECHAR UMA ÁREA PADRÃO
               EndIf

               TSC6->(dbSkip())
          Enddo

          TSC6->(dbCloseArea())

     EndIf

     RestArea(aAreax)

Return




Postado Por: ROMERO_BR
Data Postagem: terça-feira, 20 de outubro de 2020 at 11:43

Bruno Romero
Bom dia.

Agradeço a todos as dicas e sugestões. Com a ajuda de vocês melhorei meu código.


No final das contas o erro estava no ponto de entrada que eu estava utilizando. Este ponto de entrada estava executando após todos as atualizações do sistema, ou seja, o sistema por padrão realmente excluía os registros na SC0 e quando eu realizava a consulta de fato estava sempre zerado. quando executei em outro ponto de entrada. que executava antes das atualizações a consulta trouxe o valor correto.




Imprimir Página | Fechar Janela