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.
Cita:
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.
Código Delphi
[-]
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;
end
else if contador = 2 then
begin
variable2:=StringGrid1.Cells[Col,Row];
CENTRO_COSTO:=StrToInt(variable2);
end
else if contador = 3 then
begin
variable3:=StringGrid1.Cells[Col,Row];
CUENTA_CORPORATIVA:=variable3;
end
else if contador = 4 then
begin
variable4:=StringGrid1.Cells[Col,Row];
NOMBRE_CORPORATIVO:=variable4;
end else if contador = 5 then
begin
variable4:=StringGrid1.Cells[Col,Row];
NATURALEZACUENTA:=variable4;
end;
end;
end; if (contador_fila > 1) AND (contador_fila < StringGrid1.RowCount) then
begin
contador:=0;
Almacenar_Excel2;
end;
end;
OpenDialog1.Free;
Excel.Quit; ShowMessage('Se ha almacenado todos los datos de las cuentas contables y corporativas en la base de datos')
end;
procedure TForm6.Almacenar_Excel2;
var
c: integer;
StrSQL3,
StrSQL4:String;
FILTRO_CONTABLE:Boolean;
begin
FILTRO_CONTABLE:=False;
c:= 0;
if CENTINELA_MAESTRO = 1 Then
BEGIN
Cn003 := TADOConnection.Create(nil);
Rs003 := TADOQuery.Create(nil);
Conectado3:=Open_DB(Cn003 , 5 , ServerDB, NameDB2, '', PasswordDB, '' );
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
Conectado3:= Open_ADO_Qry(Cn003, Rs003,StrSQL3,false);
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
FILTRO_CONTABLE:=True;
End;
Next;
End;
end;
end;
if FILTRO_CONTABLE = False then
begin
Cn004 := TADOConnection.Create(nil);
Rs004 := TADOQuery.Create(nil);
Conectado4:=Open_DB(Cn004 , 5 , ServerDB, NameDB2, '', PasswordDB, '' );
if Conectado4 then
Begin
Conectado4:=DB_Function(Cn004,StrSQL4,4);
end;
end;
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.