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 |