Clipper On Line • Ver Tópico - Dúvida inserir data no MySql

Dúvida inserir data no MySql

Discussão sobre Banco de Dados e RDDs para Clipper/[x]Harbour.

Moderador: Moderadores

 

Dúvida inserir data no MySql

Mensagempor porter » 15 Ago 2017 11:07

Na tabela Clientes, tenho os campos
IDCLI_COD, CLI_NOME, CLI_NASCEU

Se a variável nasceu = "", quero omitir esse campo no Insert, dessa forma automaticamente o campo CLI_NASCEU assumiria NULL
mas, não estou conseguindo, achei esse exemplo, estou tentando seguir essa lógica mas não sei se o MySql aceita tomar decisão
dentro do comando INSERT.

nasceu=""

sql = "INSERT INTO Clientes"
sql = sql & "(IDCLI_cod,"
If !( nasceu = "")
{
sql = sql &"Cli_Nasceu"
}
sql = sql & ") VALUES ("2010/10/10")
If !( nasceu = "")
{
sql = sql & ",'2010/10/10'"
}
sql = sql & ")"
porter
Usuário Nível 4

Usuário Nível 4
 
Mensagens: 892
Data de registro: 10 Dez 2009 15:44
Cidade/Estado: OLIMPIA-SP
Curtiu: 3 vezes
Mens.Curtidas: 15 vezes

Dúvida inserir data no MySql

Mensagempor Itamar M. Lins Jr. » 15 Ago 2017 12:03

Ola!
Poter, crie o habito de criar as variáveis com uma letrinha em minúsculo informando o tipo.
dNasceu := iif( empty(data),NULL,dData)

Coloque seu código dentro das tags code e /code dentro dos colchetes [].

Use += para criar a string com o comando SQL.
assim:
dNasceu := iif( empty(data),NULL,dData)
cSQL := 'INSERT INTO Clientes (IDCLI_cod,cli_nasceu) Values ( '
cSql += ' " ' + xcod + ' ", '
cSql += ' " ' + dNasceu + ' " '
cSql += ' ) '


Monte a sequencia cSQL e veja antes via alert() se está tudo ok.

Saudações,
Itamar M. Lins Jr.
Avatar de usuário

Itamar M. Lins Jr.
Colaborador

Colaborador
 
Mensagens: 3361
Data de registro: 30 Mai 2007 11:31
Cidade/Estado: Ilheus Bahia
Curtiu: 94 vezes
Mens.Curtidas: 151 vezes

Dúvida inserir data no MySql

Mensagempor JoséQuintas » 15 Ago 2017 13:50

Eu fui passando por fases ao fazer isso, procurando encontrar um jeito que acharia interessante.

Numa época, pra enxergar o comando, criava o comando e depois trocava partes.

cSql := "INSERT INTO CLIENTES ( IDCLI_CODCLI, CLI_NOME, CLI_NASCEU ) VALUES ( [CODIGO], [NOME], [NASCEU] )"
cSql := Replace( cSql, "[CODIGO]", StringSql( xCod ) )
cSql := Replace( cSql, "[NOME]", StringSql( xcli_nome) )
cSql := Replace( cSql, "[NASCEU]", DateSql( dNasceu ) )


Mas quando a lista é grande, não tem jeito, melhor algum recurso extra, criando os pares e depois montando o comando, e vale pra INSERT e UPDATE.
Aí que entra a classe.

Como é o comando SQL:

INSERT INTO tabela ( campos ) VALUES ( valores )
UPDATE tabela SET campo=valor, campo=valor, ... WHERE condição

Nos dois tem a lista de nomes e valores, então primeiro é guardar a lista em um array e depois completar.
No INSERT a lista é em duas partes, e no UPDATE tem também a condição
E nos dois tem a tabela.

WITH OBJECT cnMySql
   :QueryCreate()
   :QueryAdd( "IDCLI_CODCLI", xCod )   
   :QueryAdd( "CLI_NOME", xCli_nome )
   :QueryAdd( "CLI_NASCEU", dNasceu )
   :QueryExecuteInsert( "CLIENTES" )     
// :QueryExecuteUpdate( "CLIENTES", "IDCLI_CODCLI=" + xCod )
END WITH


Para o que mencionou, para omitir um campo, bastaria:

IF ! Empty( dNasceu )
   :QueryAdd( "CLI_NASCEU", dNasceu )
ENDIF


Mas lembre-se que na alteração vai ser obrigado a indicar valor, porque pode ser que o usuário está limpando o conteúdo anterior.

Se for montar direto, teria que colocar iif() nos dois locais, o que vai deixar o fonte de montagem do comando mais confuso, principalmente se tiver muitos campos, e vai facilitar o erro.

cSql := "INSERT INTO CLIENTES ( IDCLI_CODCLI, CLI_NOME"
IF ! Empty( dDate )
   cSql += ", CLI_NASCEU"
ENDIF
cSql += " ) VALUES ("
cSql += xCodCli + ", '"  + cli_nome + "'"
IF ! Empty( dDate )
   cSql += ", '"  + hb_Dtoc( xCli_Nasceu, "YYYY-MM-DD" ) + "'"
ENDIF
cSql += ")"


Percebe a diferença em enxergar os campos nos dois fontes?
Ou em conferir se a quantidade de nomes e valores está correta?
Pode ser interessante criar uma rotina pra isso, e poder colocar no fonte um "par" de cada vez, com nome e valor.

É apenas sugestão.
A minha está valendo pra mim até eu criar outra diferente.... rs
José M. C. Quintas
Harbour 3.4, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, hbnetio, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"
Avatar de usuário

JoséQuintas
Colaborador

Colaborador
 
Mensagens: 9896
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 6 vezes
Mens.Curtidas: 626 vezes

Dúvida inserir data no MySql

Mensagempor JoséQuintas » 15 Ago 2017 14:01

Faltou dizer:
E pode colocar a parte de conversão na rotina que monta a string, menos coisa no fonte do aplicativo pra confundir.
É assim que uso.
José M. C. Quintas
Harbour 3.4, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, hbnetio, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"
Avatar de usuário

JoséQuintas
Colaborador

Colaborador
 
Mensagens: 9896
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 6 vezes
Mens.Curtidas: 626 vezes

Dúvida inserir data no MySql

Mensagempor JoséQuintas » 15 Ago 2017 14:03

Um outro com mais campos.
Fica bonito de se ver... rs
Conversão só se for pra gravar número como string.
Tente imaginar montar esse comando INSERT "a mão", como ficaria o fonte.

         WITH OBJECT cnMySql
            :QueryCreate()
            :QueryAdd( "RECIBO",     mRecibo10Recibo )
            :QueryAdd( "NEXTRA",     mNumExtrato )
            :QueryAdd( "COD",        mRecibo10Cod )
            :QueryAdd( "LOCOD",      mRecibo10LoCod )
            :QueryAdd( "LOCNOME",    mRecibo10LocNome )
            :QueryAdd( "NOME",       mRecibo10Nome )
            :QueryAdd( "VALOR",      mRecibo10Valor )
            :QueryAdd( "DIA_VENC",   mRecibo10Dia_Venc )
            :QueryAdd( "DATA",       mRecibo10Data )
            :QueryAdd( "ALUGUELNP",  mRecibo10AluguelNP )
            :QueryAdd( "ALUGUELQP",  mRecibo10AluguelQP )
            :QueryAdd( "COM",        mRecibo10Com )
            :QueryAdd( "VALORCOMIS", mRecibo10ValorComis )
            :QueryAdd( "TC",         mRecibo10Tc )
            :QueryAdd( "DB",         mRecibo10Db )
            :QueryAdd( "MES",        mRecibo10Mes )
            :QueryAdd( "MESTO",      mRecibo10MesTo )
            :QueryAdd( "EMITIDO",    mRecibo10Emitido )
            :QueryAdd( "ADIANTA",    mRecibo10Adianta )
            :QueryAdd( "TIPO",       mRecibo10Tipo )
            :QueryAdd( "PAGO",       mRecibo10Pago )
            :QueryAdd( "ANOBASE",    StrZero( Year( mDataBaixa ), 4 ) )
            :QueryAdd( "CRDATPAG",   mDataBaixa )
            :QueryExecuteInsert( "CORRENTE" )
         END WITH
José M. C. Quintas
Harbour 3.4, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, hbnetio, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"
Avatar de usuário

JoséQuintas
Colaborador

Colaborador
 
Mensagens: 9896
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 6 vezes
Mens.Curtidas: 626 vezes

Dúvida inserir data no MySql

Mensagempor Cisino Junior » 06 Nov 2017 14:05

porter escreveu:Se a variável nasceu = "", quero omitir esse campo no Insert, dessa forma automaticamente o campo CLI_NASCEU assumiria NULL


Olá porter, se no schema da sua tabela MySQL o campo "CLI_NASCEU" está como not null, significa que é obrigatório que esse campo seja preenchido. Então, você pode fazer a validação no seu aplicativo, e verificar se o usuário entrou com o dado desse campo, ou, alterar o campo para que ele aceite valor nulos, ou seja, não será obrigatório que o valor desse campo seja passado no IINSERT, você também pode setar um valor default para o campo, mas não aconselho visto que é a data de nascimento de alguém. Não sei se foi você quem modelou o banco de dados, ou outra pessoa, mas não é boa prática deixar campos que aceitem null, revise o modelo conceitual do seu banco de dados. E já que o campo está como not null, faça a validação no seu aplicativo de todos os dados obrigatórios a serem cadastrados.

Atenciosamente,
Cisino Junior.
HMG 3.4.3 + DBF, Java, MySQL, PostgreSQL, PHP, JavaScript + HTML5 + CSS3, Bootstrap, Spring, Thymeleaf.
Cisino Junior
Usuário Nível 2

Usuário Nível 2
 
Mensagens: 67
Data de registro: 14 Abr 2016 13:12
Cidade/Estado: Rio de Janeiro
Curtiu: 12 vezes
Mens.Curtidas: 5 vezes

Anterior



Retornar para Banco de Dados

Quem está online

Usuários vendo este fórum: Nenhum usuário registrado online e 1 visitante


Faça uma doação para o forum
v
Olá visitante, seja bem-vindo ao Fórum Clipper On Line!
Efetue o seu login ou faça o seu Registro