Campo ENUM - SQL

Forum sobre SQL.

Moderador: Moderadores

gilbertosilverio
Usuário Nível 3
Usuário Nível 3
Mensagens: 339
Registrado em: 18 Jan 2009 10:39
Localização: Ribeirao Pires - SP

Campo ENUM - SQL

Mensagem por gilbertosilverio »

Olá amigos,

Tenho uma base onde possuo um campo ENUM, como EDITAR, CANCELAR e NULL, onde preciso atualizar dois campos, o tipo de remessa e qual o status a executar, a ordem na base e remessa_etapaDaEntrega(varchar) e processamentoPendente(enum)

Por que se uso desta maneira na sequencia da base, funciona:

Código: Selecionar todos


// xPENDENTE =  EDITAR, CANCELAR, SPAC(08)

             IF EMPTY(ALLTRIM(xPENDENTE))
                DTLIMPA := [`processamentoPendente` = NULL ]
             ELSE
                DTLIMPA := [`processamentoPendente`=']+ALLTRIM(xPENDENTE)+[' ]
             ENDIF
             cQuery := [UPDATE `agille54_api`.`sulamerica_remessas` ] + ;
                       [SET `remessa_etapaDaEntrega`=']+ alltrim(cStatus)+[' , ]+ DTLIMPA + ;
                       [WHERE `remessa_chaveExternaRemessa`=']+ ALLTRIM(xREGISTRO)+ [' ]

Agora se eu inverte para campo processamento pendente e remessa :

Código: Selecionar todos

// xPENDENTE =  EDITAR, CANCELAR, SPAC(08)

             IF EMPTY(ALLTRIM(xPENDENTE))
                DTLIMPA := [`processamentoPendente` = NULL ]
             ELSE
                DTLIMPA := [`processamentoPendente`=']+ALLTRIM(xPENDENTE)+[' ]
             ENDIF
             cQuery := [UPDATE `agille54_api`.`sulamerica_remessas` SET ] +  DTLIMPA +[ ,  ] + ;
                       [`remessa_etapaDaEntrega`=']+ alltrim(cStatus) + ['  ] + ;
                       [WHERE `remessa_chaveExternaRemessa`=']+ ALLTRIM(xREGISTRO)+ [' ]
Da esse erro:

Código: Selecionar todos


Error WINOLE/1007  [ma-3.1.12][10.5.10-MariaDB]Unknown column 'EDITAR' in 'field list' (0x80040E14): Microsoft OLE DB Provider for ODBC Drivers (DOS Error -2147352567)
Called from ->WIN_OLEAUTO:EXECUTE(0)
Called from ->MUDA_STATUS_UM_SULAMERICA(661)
Called from ->(b)ABRIR_PORTAL_SULAMERICA(579)
Called from ->HBUTTONEX:ONCLICK(407)
Called from ->(b)HBUTTONX_NEW(319)
Called from ->ONDLGCOMMAND(477)
Called from ->(b)(_INITSTATICS00003)(0)
Called from ->HDIALOG:ONEVENT(208)
Called from ->HWG_DLGBOXINDIRECT(0)
Called from ->HDIALOG:ACTIVATE(149)
Called from ->ABRIR_PORTAL_SULAMERICA(599)
Called from ->(b)TELAPRINCIPAL(270)

O mais interessante que no Heidi funciona das duas maneiras.

Ja reli o código, para ver se não tinha nada errado, reescrevi, copiei do Heidi, e nada...

Fica aqui minha duvida do porque...
GilbertoSilverio
gilbertosilverio@gmail.com
gilbertosilverio2003@yahoo.com.br
alxsts
Colaborador
Colaborador
Mensagens: 3092
Registrado em: 12 Ago 2008 15:50
Localização: São Paulo-SP-Brasil

Campo ENUM - SQL

Mensagem por alxsts »

Olá!

O problema parece ser o fato de ter copiado do Heidi. O Heidi usa um carácter diferente para apóstrofe. Dá pra ver isto no código postado. Note que o primeiro apóstrofe na linha é diferente do último.

Código: Selecionar todos

DTLIMPA := [`processamentoPendente`=']+ALLTRIM(xPENDENTE)+[' ]
Revise os apóstrofes que vai dar certo.
[]´s
Alexandre Santos (AlxSts)
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Campo ENUM - SQL

Mensagem por JoséQuintas »

Esse apóstrofo é pra quando usa um nome de campo "diferente".
Tem certeza de que precisa dele?
Já é tão chato com as aspas, acrescentar mais um complicador parece meio... complicado kkkk

Código: Selecionar todos

IF Empty( AllTrim( xPendente ) )
   DTLIMPA := 'NULL'
ELSE
   DTLIMPA := ['] + AllTrim( xPendente ) + [']
ENDIF

cQuery := [UPDATE agille54_api.sulamerica_remessas ] + ;
   [ SET remessa_etapaDaEntrega=']+ alltrim(cStatus)+[' , processamentoPendente=] + DTLIMPA + ;
   [ WHERE remessa_chaveExternaRemessa=']+ AllTrim(xREGISTRO)+ [' ]
Apenas comentário/sugestão: Pra descomplicar um pouco, prefiro função de conversão.

Código: Selecionar todos

IF Empty( AllTrim( xPendente ) )
   DTLIMPA := 'NULL'
ELSE
   DTLIMPA := StringSQL( xPendente )
ENDIF

cQuery := "UPDATE agille54_api.sulamerica_remessas " + ;
   " SET remessa_etapaDaEntrega=" + StringSQL( cStatus) + ", processamentoPendente=" + DTLIMPA + ;
   " WHERE remessa_chaveExternaRemessa=" + StringSQL( xRegistro )
...
FUNCTION StringSQL( cTexto )
   RETURN ['] + AllTrim( cTexto ) + [']
ou ainda:

Código: Selecionar todos

IF Empty( AllTrim( xPendente ) )
   DTLIMPA := ValueSQL( Nil )
ELSE
   DTLIMPA := ValueSQL( xPendente )
ENDIF

cQuery := "UPDATE agille54_api.sulamerica_remessas " + ;
   " SET remessa_etapaDaEntrega=" + ValueSQL( cStatus) + ", processamentoPendente=" + DTLIMPA + ;
   " WHERE remessa_chaveExternaRemessa=" + ValueSQL( xRegistro )
...
FUNCTION ValueSQL( xValue )

   DO CASE
   CASE xValue == Nil
      RETURN "NULL"
   CASE ValType( xValue ) == "N"
      RETURN Ltrim( Str( xValue ) )
   CASE ValType( xValue ) == "D"
      IF Empty( xValue )
          RETURN 'NULL'
      ELSE
         RETURN ['] + Transform( Dtos( xValue ), "@R 9999-99-99" ) + [']
     ENDIF
   ENDCASE
RETURN ['] + xValue + [']
Apenas sugestão, pode evitar muito erro nessa sinalização toda.
Falta campo DATETIME, e talvez outros, mas ainda não uso esses.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
gilbertosilverio
Usuário Nível 3
Usuário Nível 3
Mensagens: 339
Registrado em: 18 Jan 2009 10:39
Localização: Ribeirao Pires - SP

Campo ENUM - SQL

Mensagem por gilbertosilverio »

Alexandre, Quintas,

Novamente muito obrigado.

Realmente Quintas to apanhando com estas conversões, vou adotar essa sua função, pelo que vi facilita muito.

Grato.
GilbertoSilverio
gilbertosilverio@gmail.com
gilbertosilverio2003@yahoo.com.br
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Campo ENUM - SQL

Mensagem por JoséQuintas »

Na minha migração eu tinha campos que no DBF eram caractere, e no MySQL eram numéricos.
Nessas horas pode ajudar forçar o tipo do campo. StringSQL(), NumberSQL()

Outra coisa que fiz, nas strings, foi aquilo de ajustar ' pra \` quando a aspa simples faz parte do texto, e outros caracteres mais.

E no NUMÉRICO: Infelizmente o Harbour não gosta de números que não vieram de onde ele conhece.

exemplo: StrZero(CODIGO)
- Se for campo de dbf de duas posições, retorna com duas posições
- Se for campo de dbf de seis posições, retorna com seis posições
- Se for outro, pode retornar com 10 posições, e até decimais
- E pra SQL.... pode ser por sorteio...

Acabei fazendo uma rotina de ler/gravar com ajuste disso pra números.
Pode ser problema gravar 1.0 num campo INT.
Ou fazer backup de inteiros com várias decimais....

É ir acompanhando e ajustando, conforme o seu uso.
Pelo menos já fica resolvido pro aplicativo inteiro ao usar essas funções.

Nota: também coloco a barra \ antes de Chr(13) e Chr(10) pra gravar textos com mudança de linha.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Responder