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.
*---------------------
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