Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   DB2 (https://www.clubdelphi.com/foros/forumdisplay.php?f=33)
-   -   Db2. Problema de almacenamiento en tablas (https://www.clubdelphi.com/foros/showthread.php?t=87269)

principiodual 05-12-2014 17:19:19

Db2. Problema de almacenamiento en tablas
 
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 [-]
//----------------------------------------------------------------------------//
//----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?


La franja horaria es GMT +2. Ahora son las 01:41:14.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi