none
Por que esse Update não funciona só no WinXP ? RRS feed

  • Pergunta

  • Eu já fiz essa pergunta dia 22/06/12 neste fórum.  Desde então estou a procura da solução pois alguns clientes ainda usam o XP, mas nunca obtive a resposta certa por aqui, ou pesquisando em outros tópicos dos fóruns MS, ou em diversas pesquisas na net.

    Não entendo o motivo de somente este update abaixo não funcionar somente em pc´s com WinXP, independente se 32 ou 64, se com SP2 ou com SP3.

    A mensagem de erro é: "Sintaxe incorreta próxima a palavra-chave 'set' ".  Segue a instrução:

    UPDATE ITENS_PE_VENDA SET QTDE_FATURADA = ISNULL(QTDE_FATURADA,0) + :QTDE

    WHERE CODIGO_PRODUTO = :CODIGO_PRODUTO
    AND VARIACAO = :VARIACAO
    AND CODIGO_PEDIDO = (SELECT CODIGO_PEDIDO FROM VALES WHERE CODIGO = :CODIGO)

    Detalhes importantes a serem considerados:

    -No Win7 (qq versão) e WinVista (qq versão) a instrução acima funciona.

    -Com o SQL2000, versão que alguns clientes ainda usam, a instrução funciona. Mas ao migrar para o SQL2008Express é que ela passa a dar a mensagem de erro citada, porém....somente no WinXP !

    -Com o SQL2008Express todas as instruções UPDATE do meu sistema, seguindo o mesmo padrão desta acima, funcionam no XP, mas só esta que não.


    Enfim, não sei mais o que fazer, onde procurar.

    Nem todos os clientes aceitam 'na boa' comprar um pc novo com Win7.

    Muito obrigado pela atenção dispensada.


    segunda-feira, 12 de novembro de 2012 13:06

Respostas

Todas as Respostas

  • Cara,

    Você está utilizando uma subquery para passar um valor novo, e nessa subquery  você soma valores pelo o que estou vendo.

    Precisa trabalhar com a função SUM nesse caso, exemplo:

    UPDATE ITENS_PE_VENDA

    SET QTDE_FATURADA =

    (

    SELECT SUM(ISNULL(IT.QTDE_FATURADA, 0) + 15)

    FROM ITENS_PE_VENDA IT

    WHERE IT.CODIGO_PRODUTO = 130

    AND IT.VARIACAO = 100

    AND CODIGO_PEDIDO =(SELECT VS.CODIGO_PEDIDO FROM VALES VS WHERE VS.CODIGO=5)

    )

    Obs.

    Talvez ele peça para você agrupar, mas não tenho muita certeza nesse caso, pois fiz de cabeça mesmo.

    Atenciosamente,

    Samuel dos Anjos


    Atenciosamente, Samuel dos Anjos

    segunda-feira, 12 de novembro de 2012 23:25
  • Dival,

    Você esta utilizando este Update em algum aplicativo que você desenvolveu?

    Normalmente este tipo de comando utilizando o dois pontos é reconhecido como algum parâmetro de passagem de valores, via algum componente de acesso a dados.

    O SQL Server não este tipo de implementação.

    Por acaso você esta utilizando a Linguagem Delphi?


    Pedro Antonio Galvão Junior [MVP | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | SorBR.Net | Professor Universitário | MSIT.com]

    terça-feira, 13 de novembro de 2012 15:55
  • Junior,

    Primeiramente muito obrigado pelo retorno !

    SIM para ambas as perguntas (aplicativo desenvolvido por mim, e na linguagem Delphi).

    Eu não vejo o problema na instrução sql, pois ela funciona perfeitamente no Win7 e no Vista, e rodava perfeitamente no XP qdo era SQL2000 (independente se win 32 ou 64)

    Alguma coisa está causando esse erro SOMENTE no XP qdo eu migro para o 2008Express. Por quê será ?  

    Na prática, o que acontece no meu cliente qdo vou migrar a versão do meu aplicativo e trocar o SQL2000 pelo 2008Express:  Todos terminais com Win7 e Vista funcionam 100%.  Aqueles com XP apresentam erro SOMENTE nesta instrução.

    Espero ter conseguido explicar o problema.

    Muito obrigado pela atenção dispensada.


    terça-feira, 13 de novembro de 2012 17:15
  • Dival,

    Qual componente você está utlizando para acessar o SQL Server, e com qual Driver ou Provider?

    O Client do SQL Server também está sendo atualizado?


    Assinatura: http://www.imoveisemexposicao.com.br

    terça-feira, 13 de novembro de 2012 18:19
  • Gapimex,

    Utilizo o ADO para me conectar ao SQL Server, com o Provider: SQLNCLI10.1

    Sim, nos terminais eu instalo o SQLNativeClient10.1 (sqlncli_x86). 

    Apenas para constar: 

    No SQL2000 eu também utilizava o ADO, mas com o Provider SQLOLEDB, e nos terminais eu não instalava nada (deixava a comunicação a cargo do MDAC

    Novamente muito obrigado pela atenção dispensada.

    terça-feira, 13 de novembro de 2012 19:08
  • O Client que você está instalando é o que segue abaixo ou algum mais recente (acredito que este abaixo é o 2008 mais recente):

    http://www.microsoft.com/pt-br/download/details.aspx?id=30440

    Acho estranho não funcionar só no XP. Entendo que a instrução SQL está funcionando com o Windows 7 ou Vista, mas acho que é possível alterar o formato da sua instrução SQL. Se você estiver disposto a fazer um teste posso tentar postar uma sugestão diferente.


    Assinatura: http://www.imoveisemexposicao.com.br

    terça-feira, 13 de novembro de 2012 20:04
  • O Client que utilizo é realmente os 2 contidos nesse pacote (sqlncli_x86 e sqlncli_ia64).

    Eu já pensei em alterar a instrução SQL (tanto que toda ajuda da sua parte é muito bem vinda) mas aí caio no seguinte: 

    Por que essa (bendita) não funcionou somente no XP ?  O que o XP tem que impede que somente essa instrução dê erro ? (há muitos 'updates' como este no meu aplicativo, mas só esse dá errado ???)

    Enfim, toda ajuda é bem vinda.

    Novamente muito obrigado pela atenção dispensada comigo.

    quarta-feira, 14 de novembro de 2012 01:51
  • Me parece mesmo um problema do driver, como este, mencionado em http://support.microsoft.com/kb/153694.

    Antes de alterar a instrução, recomendaria ativar alguma ferramenta, como o Profiler, para tentar descobrir como este comando está chegando no banco. Assim você conseguiria pelo menos descobrir o que está acontecendo com a sintaxe.


    Roberson Ferreira - Database Developer
    Acesse: www.robersonferreira.com.br
    Email: contato@robersonferreira.com.br

    Se esta sugestão for útil, por favor, classifique-a como útil.
    Se ela lhe ajudar a resolver o problema, por favor, marque-a como Resposta.

    quarta-feira, 14 de novembro de 2012 10:16
    Moderador
  • Segue a sugestão para o Update:

    UPDATE ITENS_PE_VENDA 
        SET i.QTDE_FATURADA = ISNULL(i.QTDE_FATURADA, 0) + :QTDE
    FROM ITENS_PE_VENDA as i
    JOIN VALES as v
        ON v.CODIGO_PEDIDO = i.CODIGO_PEDIDO AND v.CODIGO = :CODIGO)
    WHERE 
        i.CODIGO_PRODUTO = :CODIGO_PRODUTO AND 
        i.VARIACAO = :VARIACAO
    

    Espero que seja útil.

    Assinatura: http://www.imoveisemexposicao.com.br

    quarta-feira, 14 de novembro de 2012 13:14
  • Dival, posso estar enganado, mas acho que o Delphi no XP, qdo executado esta limitando a variavel que esta sendo executado o comando do Update. Eu não me lembro agora a dll que faz essa chamada, mas tive um amigo que apanhou (e mto) com isso. Ele mudou a chamada ou foi a sintaxe (não lembro como), faz mto tempo isso.
    quarta-feira, 14 de novembro de 2012 14:21
  • O problema não está na instrução (vide resultado do Profiler). 

    Certamente é algum conflito entre Delphi-XP-SQL2008Express, pois repito:  Com SQL2000 não dá esse erro em nenhuma versão do Windows, e com SQL2008Express só dá NESSA instrução e só NO XP.  Tem zilhões de Updates no meu aplicativo, alguns bem mais complexos do que este aí, mas o erro só acontece neste.

    Eu já tinha lido o artigo mencionado pelo Roberson Ferreira (http://support.microsoft.com/kb/153694), porém lá ele cita que o conflito é no SQLServer 6.5.

    Enfim, não sei mais o que fazer.

    Agradeço muito a ajuda de todos que se gastaram seu tempo comigo.


    Trace da instrução no Profile:

    exec sp_executesql N'UPDATE ITENS_PE_VENDA SET    QTDE_FATURADA = ISNULL(QTDE_FATURADA,0) + @P1  WHERE        (CODIGO_PRODUTO = @P2)   AND (VARIACAO       = @P3)    AND (CODIGO_PEDIDO  = (SELECT CODIGO_PEDIDO FROM VALES WHERE CODIGO = @P4)) ',N'@P1 float,@P2 varchar(2),@P3 int,@P4 int',13,'11',1,1935

    sexta-feira, 16 de novembro de 2012 19:09
  • Não sei se isso muda muito o cenário, mas todos os terminais onde esse 'update' não funciona estão com o SP3.  Também não sei da relevância disso, mas todos estão com o MDAC 2.8 (SP1) embutidos.   Pelo SQL2000 o MDAC é de extrema utilidade, mas no SQL2008Express, pelo fato de ter que instalar o SQLNCli10 no terminal, será que o MDAC perde seu papel ?  (ou pior: pode até atrapalhar causando tal problema nesse update ?)

    Muito obrigado pela atenção.

    segunda-feira, 19 de novembro de 2012 16:43
  • Desculpe mas fiquei curioso... a mensagem de erro exibida com o Update que sugeri é a mesma?

    Você pode postar a mensagem de erro completa que é exibida?


    Assinatura: http://www.imoveisemexposicao.com.br

    segunda-feira, 19 de novembro de 2012 17:19
  • Dival,

    Você esta utilizando algum ERP: Datasul ou Microsiga?


    Pedro Antonio Galvão Junior [MVP | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | SorBR.Net | Professor Universitário | MSIT.com]

    quarta-feira, 21 de novembro de 2012 16:27
  • Dival,

    Qual é a versão do MDAC que você esta utilizando?

    Durante anos foi desenvolvedor e coordenador de projetos em Delphi, e tive alguns problemas deste tipo com versões do MDAC para Windows XP.


    Pedro Antonio Galvão Junior [MVP | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | SorBR.Net | Professor Universitário | MSIT.com]

    quarta-feira, 21 de novembro de 2012 16:31
  • Junior,

    O aplicativo foi desenvolvido por mim, em Delphi7 c/ SQL2008Server R2 e Win7 (Ultimate), tudo 32 bits.   Utilizo a versão Express nos servidores somente de clientes pequenos (menos de 9 estações).   Portanto não é Datasul ou Microsiga.

    Nos terminais com XP onde o erro ocorreu o MDAC instalado é o 2.8 (SP1). Não encontrei nenhuma forma de remover essa versão e instalar uma anterior. (talvez nem seja possível pois acho que esta está embutida no SP3 do WinXP)

    Perante sua experiência em Delphi e seus respectivos conflitos com WinXP, baseado nesse texto http://support.microsoft.com/kb/232060/pt-br?wa=wsignin1.0  o MDAC pode estar relacionado, ou relacionar-se, com outros diversos aplicativos instalados, e não só obrigatoriamente com o sistema operacional ou gerenciador de banco de dados (sqlserver) ?

    Isto é, 'n' fatores diversos podem influenciar no bom funcionamento do MDAC ?

    Novamente muito obrigado pela ajuda até o momento.

    quarta-feira, 21 de novembro de 2012 18:07