PERGUNTAS E RESPOSTAS
 
Bem Vindo, Visitante  Todos os Fórums
  ADVPL
Enviar para a impressoraImprimir  Enviar e-mail para um amigoEnviar Para um Amigo
Precisa estar Logado

Subject Assunto:
Erro query
Versão:
12.1.17
Plataforma:
Microsoft
Complemento:
DB:
SQL Server
Complemento:
LinkedIn
Foto
Mensagem do Enviar e-mail Abrir o Perfil do usuário ROMERO_BR ROMERO_BR em 09/10/2020, 09:34 h
Local: SP  Registro: 12/03/2015  Postagens: 7
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?

Foto
Mensagem do Enviar e-mail Abrir o Perfil do usuário EMERSON.EN EMERSON.EN em 09/10/2020, 16:31 h
Local: SP  Registro: 20/08/2010  Postagens: 543
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.

Foto
Mensagem do Enviar e-mail Abrir o Perfil do usuário ROMERO_BR ROMERO_BR em 15/10/2020, 09:16 h
Local: SP  Registro: 12/03/2015  Postagens: 7
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?


Foto
Mensagem do Enviar e-mail Abrir o Perfil do usuário RPERICO RPERICO em 15/10/2020, 10:41 h
Local: SP  Registro: 10/01/2019  Postagens: 1
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

Foto
Mensagem do Enviar e-mail Abrir o Perfil do usuário CJ_CAMPOS CJ_CAMPOS em 15/10/2020, 10:44 h
Local: SP  Registro: 22/04/2020  Postagens: 47
Vc não se esqueceu de tirar no TSC6 os registros "deletados" do SC6 ?

Foto
Mensagem do Enviar e-mail Abrir o Perfil do usuário INFOBRENO INFOBRENO em 15/10/2020, 10:55 h
Local: MT  Registro: 02/03/2011  Postagens: 102
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 "

Foto
Mensagem do Enviar e-mail Abrir o Perfil do usuário EMERSON.EN EMERSON.EN em 15/10/2020, 11:16 h
Local: SP  Registro: 20/08/2010  Postagens: 543
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

Foto
Mensagem do Enviar e-mail Abrir o Perfil do usuário ROMERO_BR ROMERO_BR em 20/10/2020, 11:43 h
Local: SP  Registro: 12/03/2015  Postagens: 7
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.

Para postar no Fórum você precisa efetuar o seu login ou se registrar

 Mudar para Fórum

 

 

 
 
   
Pagina Principal Shopping PROTHEUS Tire suas duvidas Vagas Microsiga em todo Brasil Aprofunde seus conhecimentos Noticias Online Fale Conosco Pagina Principal