Olá!
Eu havia entendido a questão desde o inÃcio e creio que o meu exemplo atende, com um código pequeno e enxuto. Por falar em desenhar:
Para exemplo da função AEval(), consulte o Norton Guides

Moderador: Moderadores
FUNCTION Teste()
LOCAL aRecord, nVal, nPos
use bdclass shared new
use bdmatriz shared new
bdmatriz->( dbGoTop() )
WHILE bdmatriz->( ! Eof() )
aRecord := AFill( Array( 100 ), 0 )
FOR nPos := 1 TO 16
If nPos = 1
aRecord[ 1 ] := FieldGet( nPos )
Else
nVal := bdmatriz->( FieldGet( nPos ) )
aRecord[ nVal ] := nVal
EndIf
NEXT
bdclass->( dbAppend() )
AEval( aRecord, { | nVal, nPosition| bdclass->( FieldPut( If( nPosition > 1, nPosition+1, nPosition ), nVal ) ) } )
bdmatriz->( dbSkip() )
ENDDO
dbCloseAll()
RETURN NIL
FUNCTION Teste()
LOCAL aRecord, nVal, nPos
use bdclass shared new
use bdmatriz shared new
bdmatriz->( dbGoTop() )
WHILE bdmatriz->( ! Eof() )
aRecord := AFill( Array( 100 ), 0 )
FOR nPos := 1 TO 16
If nPos = 1
aRecord[ 1 ] := FieldGet( nPos )
Else
nVal := bdmatriz->( FieldGet( nPos ) )
aRecord[ nVal + 1 ] := nVal // posiciona o valor no campo correto...
EndIf
NEXT
bdclass->( dbAppend() )
AEval( aRecord, { | nVal, nPosition| bdclass->( FieldPut( nPosition, nVal ) ) } )
bdmatriz->( dbSkip() )
ENDDO
dbCloseAll()
RETURN NIL
FOR nPos := 1 TO 16
If nPos = 1
aRecord[ 1 ] := FieldGet( nPos )
Else
nVal := bdmatriz->( FieldGet( nPos ) )
aRecord[ nVal + 1 ] := nVal // posiciona o valor no campo correto...
EndIf
NEXT
Hoje em dia acho que a melhor documentação em Clipper está aqui: http://www.ousob.com/ng/clguide/.Francisco Diniz escreveu:Vc tem alguma sugestão literária que seja rica no uso destas ?
Nunca. Primeira vez...Francisco Diniz escreveu:já ouviu falar de se programar micro controladores com Clipper ?
Ele tem várias obras sobre isso. Inclusive para o Clipper 5.2 e integração com C. Como sei disso? Acabei de acessar http://www.livronauta.com.br e na busca digitei: Clipper com C.Francisco Diniz escreveu:Pergunto isto porque há algum tempo atrás eu tinha uma literatura de um autor Carlos Augusto Gomes cuja sua obra " Clipper com C" interagia as duas linguagens
/*
FRANCISCO DINIZ
---------------------------------------------------------
*** C L A S S I F I C A Ç Ã O ***
---------------------------------------------------------
*/
#define b_single 1
#define b_double 2
function main()
// --- definição das variáveis -------------------------
local opt,i,nVal,nPos,dados[26],vtr[26],getlist:={}
local Soma113,Soma1425
soma113:=soma1425:=0
opt:="S"
afill(dados,0)
afill(vtr,0)
// =============== Abertura dos Bancos de Dados ==============
select 1
use BD_PR alias bp shared new
if neterr()
setcolor("w+/r")
@16,5 say " BANCO PRINCIPAL ESTA INDISPONIVEL"
inkey(0)
quit
endif
select 2
use BCl_El alias bcl shared new
if neterr()
setcolor("w+/r")
@16,5 say "O BANCO DOS BCL ESTA INDISPONIVEL "
inkey(0)
dbcloseall()
scroll()
quit
endif
select 3
use BCl_EX alias bcx shared new
if neterr()
setcolor("w+/r")
@16,5 say "BANCO DOS BCX ESTA INDIPONIVEL"
inkey(0)
dbcloseall()
scroll()
quit
endif
// ################## Montagem Total dos Bancos BCL e BCX ################
close all
setcolor("g+/n")
@16,5 say "ATENÇÃO >> ESTA ROTINA REFAZ POR COMPLETO OS BANCOS CLASSIFICADOS"
@18,29 say "Podemos proceguir ? S/N"
@18,49 get opt picture "!"
read
if lastkey()=27.or.opt<>"S"
dbcloseall()
return nil
endif
use BCP_PQ alias bpq exclusive new
if !neterr()
zap
close
else
use BCP_PQ alias bpq shared new
setcolor("w+/r")
@16,5 say "BANCO PESQ INDISPONIVEL PARA USO"
inkey(0)
dbcloseall()
return nil
endif
// Nova formacao de BCL_EL e BCL_EX
use BCL_EL exclusive new
zap // zeramento dos bancos bcl e bcx
close
use BCL_EX exclusive new
zap
close
use bd_pr alias bp shared new
bp->(dbgotop())
// ~~~~~~~~~~ proc sugeridas pelos colegas do Forum PCTOLEDO ~~~~~~~~~~~
use BCL_EL alias bcl shared new
use BCL_EX alias bcx shared new
use BCP_PQ alias bcp shared new
while bp->(!eof())
vtr:=afill(array(26),0)
for nPos:= 1 to 16
nVal:=bp->(fieldget(nPos))
vtr[nPos]:=nVal // Posiciona o valor no campo correto
next
// A rotina acima executa perfeitamente o dscrito > São transferidos para vtr[] os valores do bp linha pós linha.
bcl->(dbappend())
aeval(vTr,{|nVal,nPosi|bcl->(fieldput(nPosi,nVal))}) // travou aqui. Que tipo de dado esta errado ?
bp->(dbskip())
enddo
dbcloseall()
return nil
aeval(vTr,{|nVal,nPosi|SalvaDados(nPosi,nVal)})Coloque esta função em seu .PRG:
Func SalvaDados( nCampo, xVal )Quando ocorrer o erro você verá na tela os dados que estão provocando o erro.
zy_nCampo := bcl->( Field( nCampo ) )
If ValType( bcl->&zy_nCampo. ) != ValType( xVal )
Clear Screen
@ 03, 02 Say "Aqui está dando erro:"
@ 05, 02 Say "Número do campo: " + LTrim( Hb_ValToStr( nCampo ) )
@ 06, 02 Say "Nome do campo : " + bcl->( Field( nCampo ) )
@ 07, 02 Say "Tipo do Campo : " + ValType( bcl->&zy_nCampo. )
@ 09, 02 Say "Dado a gravar : " + LTrim( Hb_ValToStr( xVal ) )
@ 10, 02 Say "Tipo do Dado : " + ValType( xVal )
SetPos( 12, 2 )
InKey( 0 )
EndIf
bcl->( FieldPut( nCampo, xVal ) )
Return Nil
Usuários vendo este fórum: Nenhum usuário registrado online e 7 visitantes