Página 1 de 1
INSERT campo a campo
Enviado: 06 Fev 2016 11:30
por JoséQuintas
No MySQL, existe algum equivalente ao insert com campo a campo igual update?
Código: Selecionar todos
INSERT INTO TABELA (a, b, c, d, e, f, g, h ) VALUES ( 1, 2, 3, 4, 5, 6, 7, 8 )
Código: Selecionar todos
UPDATE TABELA SET a=1, b=2, c=3, d=4, e=5, f=6, g=7, h=8
Quando a lista é grande, corre-se o risco de errar a equivalência.
E apesar do ADO ter recurso pra isso, prefiro comando SQL.
Por enquanto minha saída foi criar um construtor de comandos SQL.
Algo parecido com isto
Código: Selecionar todos
oSqlInsert := SqlInsertClass():New( "tabela" )
oSqlInsert:AddFIeld( "campo1", valor1 )
oSqlInsert:AddFIeld( "campo2", valor2 )
? oSqlInsert:ToString()
Pelo menos fica visível o que está gravando em cada campo.
INSERT campo a campo
Enviado: 20 Fev 2016 09:07
por Poka
Olá Quintas
Fiz uma rotina de inclusão e alteração que funciona bem com firebird, estou passando a de inclusão, de repente se for útil para alguma coisa.
Declarar tudo em lista de campos e lista de valores, sem chance, tenho arquivo de nota fiscal por exemplo com "trocentos" campos.
Código: Selecionar todos
*---------------------
mx:={}
vcodigo:=120
vnome:="Roberto"
vsalario:=3000.50
vtexto:="texto"
//
aadd(mx,"codigo","n" ,vcodigo)
aadd(mx,"nome","c" ,vnome)
aadd(mx,"salario","n" ,vsalario)
aadd(mx,"texto","m" ,vtexto)
if empty(xmen:=fb_insert("funcionario",mx) )
msginfo("Ok")
else
msginfo(xmen)
endif
retu nil
*-------------------------------------
func fb_Insert(xxarq,xMx)
// mx é uma matriz que contem nome do campo , tipo e conteudo
// xarq é a tabela
local _men:="" ,a,x , xqtdecimal:=0
priva xarq:=xxarq , xcampo, xconteudo:="" , xtipo:="" , mx:=xmx
listaCampos:=""
ListaConteudo:=""
for a:= 1 to len(mx)
xcampo:=mx[a,1]
xtipo:=upper(mx[a,2] )
xconteudo:=mx[a,3]
if xtipo $ "CM"
xconteudo:=strTran(xconteudo,"'","´")
endif
IF xtipo="C"
xconteudo:=strtran(xconteudo,"'","´")
ListaCampos+=xcampo
listaConteudo+="'"+xconteudo+"'"
elseIF xtipo="D"
ListaCampos+=xcampo
if empty( xconteudo)
xconteudo:="0001-01-01"
else
xconteudo:=strzero(year(xconteudo) ,4)+"-"+ strzero(month(xconteudo),2)+"-"+strzero(day(xconteudo),2)
endif
ListaConteudo+="'"+xconteudo+"'"
elseIF xtipo="N"
ListaCampos+=xcampo
xqtdecimal:=qtDecimal(xconteudo)
listaConteudo+="'"+ alltrim( str(xconteudo,14,xqtdecimal)) +"'"
elseIF xtipo="M"
ListaCampos+=xcampo
listaConteudo+="'"+xconteudo+"'"
endif
if a < len(mx)
ListaCampos+=+","
listaConteudo+=","
endif
next
Str:="insert into "+xarq+" ("+listaCampos+") values (" + listaconteudo+");"
_men:=Fb_executa()
*--------------
release xarq , xcampo , xconteudo, xtipo
retu _men
*----------------------------------------------
func Fb_executa
// se retornar mensagem em branco, deu certo
local _men:="" , xConexao:="oConnection"
&(xConexao):Setsql( Str )
if ! &(xConexao):open()
_men:= &(xconexao):SQLErrorMessage()
endif
if empty( _men)
// deu certo
M_select:=&(xconexao):aRecordSet // matriz ja declarada como publica anteriormente
// na rotina que chama pode testar m_select, se vazia ou nao
else
m_select:={}
endif
retu _men
*-----------------
func qtDecimal(xnum)
// retorna a qt de casas decimais de um numero
local xqt:=0
xnum:= alltrim(str(xnum - int(xnum) ))
xqt:=len(alltrim(substr( xnum,3,20) ) )
retu (xqt)
Poka
INSERT campo a campo
Enviado: 20 Fev 2016 10:53
por JoséQuintas
Acabou fazendo praticamente a mesma coisa, e poderia até reduzir aproveitando minha rotina.
Dá certo isso no Add() ?
Eu uso o própio tipo da variável pra conversão, o array fica só com nome e conteúdo.
Código: Selecionar todos
METHOD ToString( cTable ) Class SqlInsertClass
LOCAL cSql, oField, nCont := 1
cSql := "INSERT INTO " + cTable + " ( "
FOR EACH oField IN ::aFields
cSql += oField[ 1 ] + iif( nCont == Len( ::aFields ), "", ", " )
nCont += 1
NEXT
cSql += " ) VALUES ( "
nCont := 1
FOR EACH oField in ::aFields
cSql += ValueSql( oField[ 2 ] ) + iif( nCont == Len( ::aFields ), "", ", " )
nCont += 1
NEXT
cSql += " )"
RETURN cSql
FUNCTION ValueSql( xCampo )
IF ValType( xCampo ) == "D"
IF Empty( xCampo )
RETURN "NULL"
ELSE
RETURN ['] + Transform( Dtos( xCampo ), "@R 9999-99-99" ) + ['] )
ENDIF
ENDIF
RETURN ['] + Transform( xCampo, "" ) + [']
INSERT campo a campo
Enviado: 20 Fev 2016 11:03
por JoséQuintas
No Harbour, o Aadd não aceita isso, a não ser que exista hb_Add() com esse recurso a mais.
Código: Selecionar todos
PROCEDURE Main
LOCAL a := {}
AAdd( a, nCont, nCont, nCont )
? a[ 1, 1 ], a[ 1, 2 ], a[ 1, 3 ]
RETURN
test.prg(3) Error E0021 Incorrect number of arguments in AADD
Passed: 4, expected: 2
1 error
INSERT campo a campo
Enviado: 20 Fev 2016 15:54
por alxsts
Olá!
Respondendo a questão inicial do tópico: não, não existe. A especificação do
SQL ANSI, de onde todos os SGBS derivaram suas especificações próprias, não contempla isto. Já me perguntei isto há alguns anos. Seria bem mais prático mas, não existe.
INSERT campo a campo
Enviado: 20 Fev 2016 16:45
por Poka
desculpe , errei no escrever o exemplo, o correto é
aadd(mx,{"codigo","n" ,vcodigo})
aadd(mx,{"nome","c" ,vnome})
aadd(mx,{"salario","n" ,vsalario})
aadd(mx,{"texto","m" ,vtexto})
Poka