Clipper On Line • Ver Tópico - Campo ENUM - SQL

Campo ENUM - SQL

Discussão sobre SQL

Moderador: Moderadores

 

Campo ENUM - SQL

Mensagempor gilbertosilverio » 20 Set 2021 07:25

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:


// 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 :

// 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:


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
Usuário Nível 3

Usuário Nível 3
 
Mensagens: 332
Data de registro: 18 Jan 2009 09:39
Cidade/Estado: Ribeirao Pires - SP
Curtiu: 1 vez
Mens.Curtidas: 23 vezes

Campo ENUM - SQL

Mensagempor alxsts » 20 Set 2021 09:18

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.
DTLIMPA := [`processamentoPendente`=']+ALLTRIM(xPENDENTE)+[' ]

Revise os apóstrofes que vai dar certo.
[]´s
Alexandre Santos (AlxSts)
alxsts
Colaborador

Colaborador
 
Mensagens: 2945
Data de registro: 12 Ago 2008 15:50
Cidade/Estado: São Paulo-SP-Brasil
Curtiu: 21 vezes
Mens.Curtidas: 248 vezes

Campo ENUM - SQL

Mensagempor JoséQuintas » 20 Set 2021 13:36

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

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.

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:
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, multithread, dbfcdx, ADO+MySql, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 18150
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1215 vezes

Campo ENUM - SQL

Mensagempor gilbertosilverio » 20 Set 2021 14:17

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
Usuário Nível 3

Usuário Nível 3
 
Mensagens: 332
Data de registro: 18 Jan 2009 09:39
Cidade/Estado: Ribeirao Pires - SP
Curtiu: 1 vez
Mens.Curtidas: 23 vezes

Campo ENUM - SQL

Mensagempor JoséQuintas » 20 Set 2021 17:04

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, multithread, dbfcdx, ADO+MySql, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 18150
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1215 vezes




Retornar para SQL

Quem está online

Usuários vendo este fórum: Nenhum usuário registrado online e 3 visitantes


Ola Amigo, espero que meu site e forum tem lhe beneficiado, com exemplos e dicas de programacao.
Entao divulgue o link da Doacao abaixo para seus amigos e redes sociais ou faça uma doacao para o site forum...
MUITO OBRIGADO PELA SUA DOACAO!
Faça uma doação para o forum
cron
v
Olá visitante, seja bem-vindo ao Fórum Clipper On Line!
Efetue o seu login ou faça o seu Registro