PDA

Ver la Versión Completa : Db2. Problema de almacenamiento en tablas


principiodual
05-12-2014, 17:19:19
Buenos Días a todos, el siguiente es para consultar lo siguiente.

yo tengo un aplicativo que desarrollé el cual se conecta con una base de datos en DB2 y todo bien, hace la conexión perfectamente, pero en una
de las tablas cuando voy a hacer un llenado con un archivo en excel de muchas filas de registros, este se cuelga y solo sube como poco mas de
100 filas, quedando la mayoría sin registrarse en la tabla en dicha base de datos de db2.

el error que me aparece es el siguiente:

Project PRUEBA.exe raised exception class EOleException with message '[IBM][CLI Driver]SQL0954C No
hay suficiente almacenamiento disponible en la pila de aplicación para procesar la sentencia. SQLSTATE=57011'.

Según he averiguado algo en la página principal de IBM tiene que ver con la memoria que uno asigna a la tabla, al parecer es poca, pero no estoy
seguro de si realmente es por ello o porque es mi método de lectura y subida de datos en excel. Quizás alguien me pueda ayudar en esto o le haya sucedido y sepa la razón de porque sucede esto.

NOTA: estoy aprendiendo a trabajar con el entorno en DB2 que se me hace algo complicado y no sabría como darle mas memoria a la tabla
para corroborar que ese sea el fallo, si alguien me puede guiar en ello o sugerirme alguna documentación directa,he leído varios foros pero no
explican directamente como asignar memoria y esas cosas a las tablas de la base de datos.

Esta es la explicación que encontre de parte de la página de IBM.

SQL0954C
No hay suficiente almacenamiento disponible en la pila de aplicación para procesar la sentencia.
Explicación:
Se ha utilizado toda la memoria disponible para la aplicación.
No se puede procesar la sentencia.
Respuesta del Usuario:
Interrumpa la aplicación al recibir este mensaje. Aumente el parámetro de configuración de la base de datos ( applheapsz ) para que permita una pila de aplicación más grande.
sqlcode : -954
sqlstate : 57011

Este es mi método o procedimiento que he desarrollado a base de uno que me facilitaron en esta misma Web.

//----------------------------------------------------------------------------//
//----PROCEDIMIENTO PARA CARGAR EL EXCEL PARA LA OPCIÓN CUENTAS CONTABLES ----//
//--------------------------------Y CORPORATIVAS------------------------------//


procedure TForm6.Cargar_Excel2;
var
Excel, WrkS, WrkB : OLEVariant;
Row, Col : Integer;
Rows, Cols : Integer;
variable,
variable2,
variable3,
variable4:String;
contador_fila,
contador:Integer;

i:Integer;

begin
contador_fila:=0;
contador:=0;

i:=0;

Excel := CreateOleObject('Excel.Application');
Excel.Workbooks.Open(Edit1.Text);

WrkS := Excel.Worksheets[1];
Cols := WrkS.UsedRange.Columns.Count;
Rows := WrkS.UsedRange.Rows.Count;

for Row:= 1 to StringGrid1.RowCount do
StringGrid1.Rows[Row].Clear;

StringGrid1.FixedRows := 1;
StringGrid1.FixedCols := 1;
StringGrid1.RowCount := Rows + 1;
StringGrid1.ColCount := Cols + 1;

for Row:= 1 to StringGrid1.RowCount do
begin

contador_fila:=contador_fila+1;

for Col:= 1 to StringGrid1.ColCount do
begin
StringGrid1.Cells[Col,Row]:= Excel.ActiveSheet.Cells[Row,Col].Value;

if (StringGrid1.Cells[Col,Row] <> '') and (contador_fila > 1) then
begin
contador:=contador+1;

if contador = 1 then
begin
variable:=StringGrid1.Cells[Col,Row];
CODIGOCONTABLE:=variable;
//ShowMessage(CODIGOCONTABLE);
end
else if contador = 2 then
begin
variable2:=StringGrid1.Cells[Col,Row];
CENTRO_COSTO:=StrToInt(variable2);
//ShowMessage(IntToStr(TIPOCUENTA));
end
else if contador = 3 then
begin
variable3:=StringGrid1.Cells[Col,Row];
CUENTA_CORPORATIVA:=variable3;
//ShowMessage(IntToStr(NATURALEZACUENTA));
end
else if contador = 4 then
begin
variable4:=StringGrid1.Cells[Col,Row];
NOMBRE_CORPORATIVO:=variable4;
//ShowMessage(CUENTA_CONTABLE_CORPORATIVA);
end else if contador = 5 then
begin
variable4:=StringGrid1.Cells[Col,Row];
NATURALEZACUENTA:=variable4;
//ShowMessage(CUENTA_CONTABLE_CORPORATIVA);
end;




end; // fin de la condición de que las celdas sean diferente de vacio
//y el contador de la fila en 1, es decir esté ya en la segunda fila.

end; // Fin del recorrido por columnas...
if (contador_fila > 1) AND (contador_fila < StringGrid1.RowCount) then
begin
contador:=0;
//ShowMessage(CODIGOCONTABLE);
//ShowMessage(IntToStr(TIPOCUENTA));
//ShowMessage(IntToStr(NATURALEZACUENTA));
//ShowMessage(CUENTA_CONTABLE_CORPORATIVA);
Almacenar_Excel2;
end;
end;
OpenDialog1.Free;
Excel.Quit; //Fin del recorrido por fila...
ShowMessage('Se ha almacenado todos los datos de las cuentas contables y corporativas en la base de datos')

end;


//-------PROCEDIMIENTO PARA ALMACENAR CUENTAS CONTABLES Y CORPORATIVAS--------//


procedure TForm6.Almacenar_Excel2;
var
c: integer;
StrSQL3,
StrSQL4:String;

FILTRO_CONTABLE:Boolean;
begin
FILTRO_CONTABLE:=False;
c:= 0; // Índice de la columna donde se almacena TagId
//Define los Objetos ADO

if CENTINELA_MAESTRO = 1 Then
BEGIN

Cn003 := TADOConnection.Create(nil);
Rs003 := TADOQuery.Create(nil);

Conectado3:=Open_DB(Cn003 , 5 , ServerDB, NameDB2, '', PasswordDB, '' );
(*
Rs002.Open;
Rs002.Edit;
Rs002.Insert; *)

StrSQL3:= 'SELECT * FROM GEINVZLA_TB_MAPPING_CUENTAS';

StrSQL4:='INSERT INTO GEINVZLA_TB_MAPPING_CUENTAS(CODIGOCONTABLE,CENTRO_COSTO,CUENTA_CORPORATIVA,NOMBRE_CORPORATIVO,NATURA LEZACUENTA)'
+'VALUES('+chr(39)+(CODIGOCONTABLE)+chr(39)+','
+IntToStr(CENTRO_COSTO)+','
+chr(39)+(CUENTA_CORPORATIVA)+chr(39)+','
+chr(39)+NOMBRE_CORPORATIVO+chr(39)+','
+chr(39)+NATURALEZACUENTA+chr(39)+');';


if Conectado3 then
Begin

//Se Abre el DataSet de la factura
Conectado3:= Open_ADO_Qry(Cn003, Rs003,StrSQL3,false);
//Conectado3:=DB_Function(Cn003,StrSQL3,4);
with Rs003 do
begin

while not Eof do
begin

if (FieldByName('CODIGOCONTABLE').AsString = CODIGOCONTABLE) or (FieldByName('CENTRO_COSTO').AsInteger = CENTRO_COSTO) and (FieldByName('CUENTA_CORPORATIVA').AsString =
CUENTA_CORPORATIVA) and (FieldByName('NOMBRE_CORPORATIVO').AsString = NOMBRE_CORPORATIVO) and (FieldByName('NATURALEZACUENTA').AsString = NATURALEZACUENTA) then
Begin
//ShowMessage(intToStr(EJERCICIO));
FILTRO_CONTABLE:=True;
End;

Next;
End;
end;

//Conectado2:= Open_ADO_Qry(Cn002,Rs002,StrSQL,false);
//Conectado2:=DB_Function(Cn002,StrSQL,4);
end;


if FILTRO_CONTABLE = False then
begin

Cn004 := TADOConnection.Create(nil);
Rs004 := TADOQuery.Create(nil);

Conectado4:=Open_DB(Cn004 , 5 , ServerDB, NameDB2, '', PasswordDB, '' );
(*
Rs003.Open;
Rs003.Edit;
Rs003.Insert; *)

if Conectado4 then
Begin
Conectado4:=DB_Function(Cn004,StrSQL4,4);
end;

end; // fin de la condición si el filtro es falso, es decir no existe ya la columna
// en la base de datos.

(*
rs003.Close;
rs003.Free;
CloseConnection (cn004, rs004); *)
END

ELSE
ShowMessage('Compruebe la conexión a la base de datos y los datos necesarios');

end;


Si alguien me puede ayudar o dar una idea, seguiré averiguando por mi parte como puedo darle mas memoria o modificar la capacidad de
la tabla para poder realizar la operación, espero no sea por mi método de Excel porque sería mas laborioso. Muchas gracias y espero este
sea el lugar para publicar este tema.

orodriguezca
05-12-2014, 20:20:12
Algo que veo "erroneo" es que por cada iteracción se están creando dos objetos de conexión y nunca se liberan los objetos ni se cierra la conexión.

principiodual
05-12-2014, 22:19:06
muchas gracias por la información, el código es muy extenso y debo limpiarlo, tengo también algunas variables demás, pero ya tengo todo identificado y voy a cerrar los objetos que uso para la conexión, de todas maneras el problema es otro, ¿no se si me pueda ayudar?