Hola:
Estoy migrando los datos de contabilidad y al mismo tiempo cambiando la
estructura del balance para llevarlo a tiempo real.
El balance actual esta contenido en tablas individuales por cada mes CERRADO,
por eso para producir el balance en tiempo real hay que pasar la historia del
año en curso a la nueva estructura, cuando una empresa tiene algun tiempo en el
sistema.
Para eso hice una clase con un un boton que efectúa un bucle por los meses del
año cerrado para ir construyendo la tabla sql poco a poco.
Inicialmente estaba produciendo un solo COMMIT al final y lo descontinue
pensando en que el gran volumen de datos coparia el buffer
de memoria donde presumo se guardan los datos antes del commit; pero esto no dio
resultados
METHOD PushButton1( ) CLASS ProdBalWindow
LOCAL sFile,sMes,sAnoMes,sAnoMes1 AS STRING
LOCAL y AS DWORD
LOCAL oControl,oServer AS OBJECT
LOCAL aStru AS ARRAY
SELF:oCCPushButton1:DISABLE()
oControl:=sqlselect{'select * from cgdmv02 for update',oConn}
oServer:=dbserver{'c:\sigger\cgdmsa4',FALSE}
FOR y=1 UPTO 12
sMes:='ME'+AllTrim(Str(y,2))
IF oControl:FIELDGET(sMes)=1 //MES ABIERTO
oControl:close()
oServer:zap()
RETURN NIL
ENDIF
sFile:='ma04'+StrZero(y,2)+SubStr(Str(oControl:ano,4),3,2)
sAnoMes:=Str(oControl:ano,4)
sAnoMes1:=Str(oControl:ano+1,4)
SELF:oDCMultiLineEdit1:AddOk(sFile+' Procesando',FALSE)
oServer:zap()
oServer:appenddb(sFile)
oServer:Gotop()
aStru:=oServer:dbstruct
SELF:ProduceMeses(OsERVER,sAnoMes,sAnoMes1,y)
NEXT
oControl:close()
oServer:close()
RETURN NIL
METHOD ProduceMeses(oServer,sAnoMes,sAnoMes1,y) CLASSProdBalWindow
LOCAL sDeb AS STRING
LOCAL Z,I AS DWORD
LOCAL oSqlStat AS OBJECT
LOCAL aStru AS ARRAY
DO WHILE !oServer:EOF
oSqlStat:=sqlselect{'select * from cgdmv05 where
cod+an1+ANOMES="'+oServer:cod+ConvierteComillas(oServer:an1)+sAnoMes+'" FOR
update',oConn}
IF !osQLSTAT:STATUS=NULL_OBJECT
SELF:oDCMultiLineEdit1:ADDOK(oSqlStat:SQLSTRING,FALSE)
SELF:oDCMultiLineEdit1:ADDOK(oSqlStat:STATUS:DESCRIPTION,FALSE)
oSqlStat:errinfo:SHOWERRORmSG()
ENDIF
IF oSqlStat:reccount=0
IF !oSqlStat:append()
TEXTerror(OsQLSTAT:SQLSTRING)
ENDIF
//crea el registro actualizando muchos campos
oSqlStat:Commit()
oSqlStat:skip()
ELSE
//actualiza la tabla
oSqlstat1:Commit()
oSqlStat1:skip()
ENDIF
oserver:skip()
oSqlstat:Commit()
ENDDO
oSqlstat:Commit()
oSqlStat:Close()
RETURN NIL
Cuando procesa algo menos de la mitad del segundo mes, se revienta el programa
con el mensaje "DYNAMIC MEMORY LOW"
Les agradezco cualquier ayuda el respecto
Saludos
Edgardo Solano