Hola :
.Alguien sabe si en Xharbour-FiveWin con el RDD de ADS se puede almacenar un arreglo en un campo memo. En Clipper-FiveWin con ADS si lo puedo hacer.
Gracias
Theler Hugo
Hola :
.Alguien sabe si en Xharbour-FiveWin con el RDD de ADS se puede almacenar un arreglo en un campo memo. En Clipper-FiveWin con ADS si lo puedo hacer.
Gracias
Theler Hugo
Si, en campos memo con el driver CDX y en campos blob con ADTs
Gracias Rene , voy a probar.
Hola :
Como hago para grabar en un campo BLOB ( un Arreglo ) , Que funcion utilizo ??
En clipper 5.3 y ADS lo hago muy simple :
Field->CampoMemo := aDatos
Lo mismo para leerlo de un archivo
aDatos := Field->CampoMemo
Esto no me es soportado ( Aparentemente por xHarbour ) y ADS...? o necesito alguna otra función...?
local aDir := Directory("*.*")
local aTbl := {{"ARREGLO","M",10,00}}
dbcreate("prueba.dbf",aTbl,"DBFCDX")
use prueba
prueba->ARREGLO := aDir
aDir := NIL
aDir := prueba->ARREGLOContinuando el caso es que no me funciono de esta manera por que algo habia en ese entonces que fallaba en el rdd.
por lo que tube que hacer uso de dos funciones de xharbour que pasara el contenido del arreglo a texto y luego que una vez recuperado el texto lo trasnformara en array.
como estoy alejado de mi codigo hoy, y la verdad me acuerdo poco, creo recordar que hb_valtoprg pasa el valor del array a texto que se almcena facilmente a un campo memo y una funcion hb_arrayexec o algo asi que pasa un texto a un array nuevamente.
en esto ultimo habria que investigar
de cualquier forma mañana puedo postear el codigo que utilizo.
me informas como avanzas ![]()
salu2
carlos vargas
PROCEDURE ReporteDeSaldo_Proceso(lDetalle)
LOCAL cId
LOCAL anInfo
LOCAL nCuotas
PRIVATE nContador
/*desabilita controles*/
oFecha:disable()
oBtnOk:disable()
oBtnExit:disable()
/*incializa contador*/
nContador := 0
/*solo contratos activos*/
IF empty( dFecha )
SET FILTER TO CONT->USSALDOI>0 .AND. CONT->USMONTO>10 .AND. !CANCELADO
ELSE
SET FILTER TO CONT->USSALDOI>0 .AND. CONT->USMONTO>10 .AND. CONT->FECHA <= DFECHA .AND. !CANCELADO
ENDIF
CONT->(DBGoTop())
/*cuenta registros*/
COUNT TO nContador
/*define margen de progress bar*/
oPBar:SetRange(1,nContador)
/*inicio de tabla de contratos*/
CONT->(DBGoTop())
/*procesa cada contrato hasta alcanzar el final del archivo*/
nContador := 0
WHILE !CONT->(Eof())
/*actualiza avanze en barra de progreso*/
oPBar:SetPos(++nContador)
oGet:SetText("Procesando contrato no. ["+RTrim(CONT->ID)+"]")
/*procesa llamadas de windows*/
SysRefresh()
/*recupera informacion de los pagos de este contrato*/
IF !lDetalle
aInfo:=ReporteDeSaldo_LoPagado()
ELSE
aInfo:=ReporteDeSaldo_LoPagado2()
ENDIF
/*inserta informacion de pagos de este contrato*/
SALD->(DBAppend())
SALD->TT_CONTA := nContador
SALD->TT_CONTR := CONT->ID
SALD->TT_SUSCR := CONT->NOMBRE
SALD->TT_FECHA := CONT->FECHA
SALD->TT_PAGAD := aInfo[CP_PAGADO ]
SALD->TT_CAPIT := aInfo[CP_CAPITAL]
SALD->TT_INTER := aInfo[CP_INTERES]
SALD->TT_SEGUR := aInfo[CP_SEGURO ]
SALD->TT_NUMPA := aInfo[CP_PAGOS ]
SALD->TT_NOTAS := ValToPrgExp(aInfo[CP_DETALLE]) //aca se guarda
cId:=CONT->ID
/*numero de cuotas*/
IF StrCharCount(cId,"-")>2
SALD->TT_NUMCU:=Val(StrToken(cId,3,"-"))*12
ENDIF
/*calculo del valor inicial del contrato*/
SALD->TT_VALOR:=ReporteDeSaldo_ValorContrato()
/*calculo del saldo*/
SALD->TT_SALDO:=SALD->TT_VALOR - SALD->TT_PAGAD
/*siguiente contrato*/
CONT->(DBSkip())
ENDDO
/*mensaje informativo*/
Msginfo("Fin de proceso, "+AllTrim(Transform(nContador,"99,999,999"))+" Contratos procesados")
/*reporte a excel*/
IF lDetalle
ReporteDeDetalle_ToExcel()
ELSE
ReporteDeSaldo_ToExcel()
ENDIF
/*habilita controles*/
oFecha:enable()
oBtnOk:enable()
oBtnExit:enable()
RETURNHola Carlos
Esto es exactamente lo que iba a buscar hoy, ya que me acaba de surgir la necesidad de grabar los datos de un arreglo, para despues recuperlos y aplicarlos a X proceso.
El detalle es que si agrego el campo memo a la base, me manda un error y me truena la app, si se lo quito trabaja normal, estoy linkando la DBFFTP.LIB.
Cualquier sugerencia al respecto es bienvenida
Saludos Amigo
a ver, que te parece si lo miramos en detalle en el meseenger hoy por la tarde, luego publicamos los resultados aca mismo ![]()
veremos en detalle lo que necesitas realizar.
salu2
carlos vargas
Carlos :
Claro que si, estare en linea.
Saludos Amigo
PROCEDURE Main
LOCAL aArray := {{"carlos",.t.,123,date(),nil}}
local bArray := {1,date(),time(),pi(),.f.,nil}
local a, b, c, d
a := ArrayToPrg( aArray )
b := ArrayToPrg( bArray )
?a
?b
c=&(a)
d=&(b)
?valtype(c),len(c),len(c[1]),c[1,1]
?valtype(d),len(d),d[1],d[2],d[3],d[4],d[5],d[6]
RETURN
//--------------------------------------------------------------//
FUNCTION ArrayToPrg( xVal )
LOCAL cType := ValType( xVal )
LOCAL cRet := '{}'
LOCAL aVar
DO CASE
CASE cType == "A"
cRet := "{ "
FOR EACH aVar IN xVal
cRet += ( ArrayToPrg( aVar ) + ", " )
NEXT
IF cRet[ -2 ] == ','
cRet[ -2 ] := ' '
ENDIF
cRet[ -1 ] := '}'
RETURN cRet
CASE cType == "D"
RETURN "stod( '" + dtos( xVal ) + "' )"
CASE cType == "N"
RETURN ltrim( str( xVal ) )
CASE cType == "L"
RETURN iif( xVal, ".T.", ".F." )
CASE cType == "C"
RETURN "'"+xVal+"'"
CASE cType == "U"
RETURN "NIL"
ENDCASE
RETURN cRet
//--------------------------------------------------------------//