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