Ir al contenido


Foto

¿por que no puedo insertar mas de 1 vez?


  • Por favor identifícate para responder
4 respuestas en este tema

#1 giulichajari

giulichajari

    Advanced Member

  • Miembros
  • PipPipPip
  • 477 mensajes

Escrito 06 enero 2015 - 12:15

Hola amigos, tengo una transaccion para insertar clientes en DataSnap, y accedo con la aplicacion cliente.
El caso es que inicio la aplicacion e inserto correctamente el primer cliente, pero si quiero volver a insertar me dice: REmote error:Invalid transaction object.

Osea los procedimientos estan bien, se me hace que faltaria destruir el objeto de transaccion, y crearlo cuando se llama al procedure, la verdad no se.

Tengo otras inserciones que dan el mismo problema.



delphi
  1. function TServerMethods1.insertarcliente(idlocalidad,DNI,cuit,cuil,cupodias:integer;
  2. descuento,cupocheques,cupopesos,cupochequestro:Double;domicilio,nombreyape,direccion,email:string):boolean;
  3.  
  4. var
  5. uubicacion,upersona,ucliente:integer;
  6. tr:tdbxTransaction;
  7. exito:boolean;
  8. begin
  9.  
  10.         SUCURSAL.Open;
  11.         tr:=SUCURSAL.BeginTransaction();
  12.  
  13.  
  14.               try
  15.  
  16.                 begin
  17.                   with qipersona do
  18.                     begin
  19.                       Close;
  20.                       ParamByName('DNI').AsInteger:=DNI;
  21.                       ParamByName('nombreyape').AsString:=nombreyape;
  22.                       ParamByName('direccion').AsString:=direccion;
  23.                       ParamByName('email').AsString:=email;
  24.                       ExecSQL();
  25.                       Free;
  26.  
  27.                     end
  28.                   end
  29.                     except
  30.                       SUCURSAL.RollbackFreeAndNil(tr);
  31.  
  32.                 end;
  33.         try
  34.           begin
  35.               with qicliente do
  36.                 begin
  37.                 Close;
  38.                 ParamByName('idpersona').AsInteger:=qucli.ExecSQL();
  39.                 ParamByName('cuit').AsInteger:=cuit;
  40.                 ParamByName('cuil').AsInteger:=cuil;
  41.                 ParamByName('deuda').AsFloat:=0.00;
  42.                 ParamByName('cupodias').AsInteger:=cupodias;
  43.                 ParamByName('cupocheques').AsFloat:=cupocheques;
  44.                 ParamByName('cupopesos').AsFloat:=cupopesos;
  45.                 ParamByName('cupochequestro').AsFloat:=cupochequestro;
  46.                 ParamByName('descuento').AsFloat:=descuento;
  47.                 ExecSQL();
  48.                 Free;
  49.                 SUCURSAL.CommitFreeAndNil(tr);
  50.  
  51.                 exito:=True;
  52.             end
  53.             end
  54.               except
  55.  
  56.                 SUCURSAL.RollbackFreeAndNil(tr);
  57.                 end;
  58.                 Result:=exito;
  59.  
  60. end;
  61.  
  62. function TServerMethods1.insertartelefonoscliente(numero,idtipotel:integer;descripciontel:string):boolean;
  63. var
  64. tr:TDBXTransaction;
  65. exito:boolean;
  66. begin
  67.  
  68.           SUCURSAL.Open;
  69.           if (SUCURSAL.InTransaction=False) then
  70.           tr:=SUCURSAL.BeginTransaction()
  71.           else
  72.           begin
  73.             try
  74.               begin
  75.                 with qtelefono do
  76.                   begin
  77.  
  78.                     Close;
  79.                     ParamByName('numero').AsInteger:=numero;
  80.                     ParamByName('idtipotel').AsInteger:=idtipotel;
  81.                     ParamByName('descripcion').AsString:=descripciontel;
  82.                     ExecSQL();
  83.  
  84.                     Free;
  85.                   end;
  86.               end;
  87.         // si no se pudo
  88.             except
  89.               begin
  90.                 SUCURSAL.RollbackFreeAndNil(tr);
  91.                 exito:=false;
  92.               end;
  93.         try
  94.               with telcli do
  95.                 begin
  96.                   Close;
  97.                   ParamByName('idc').AsInteger:=qucliente.ExecSQL();
  98.                   ParamByName('idt').AsInteger:=qut.ExecSQL();
  99.                   ExecSQL();
  100.  
  101.                   Free;
  102.                 end;
  103.         except
  104.                 SUCURSAL.RollbackFreeAndNil(tr);
  105.                 exito:=false;
  106.  
  107.         end;
  108.         SUCURSAL.CommitFreeAndNil(tr);
  109.  
  110.               end;
  111.               Result:=exito;
  112.           end;
  113.  
  114. end;
  115.  
  116. function TServerMethods1.insertarubicacionescliente(idlocalidad:Integer;domicilio,descripcion:string):boolean;
  117.  
  118. var
  119. tr:TDBXTransaction;
  120. exito:boolean;
  121. begin
  122.  
  123.         SUCURSAL.Open;
  124.         if (SUCURSAL.InTransaction=False) then
  125.  
  126.           tr:=SUCURSAL.BeginTransaction()
  127.           else
  128.           begin
  129.       try
  130.         with qiubicacion do
  131.           begin
  132.  
  133.             Close;
  134.             ParamByName('idlocalidad').AsInteger:=idlocalidad;
  135.             ParamByName('domicilio').AsString:=domicilio;
  136.             ParamByName('descripcion').AsString:=descripcion;
  137.             ExecSQL();
  138.  
  139.             Free;
  140.  
  141.           end;
  142.         // si no se pudo
  143.       except
  144.  
  145.  
  146.           SUCURSAL.RollbackFreeAndNil(tr);
  147.           exito:=false;
  148.  
  149.         end;
  150.         try
  151.  
  152.               with quper do
  153.                 begin
  154.                   Close;
  155.                   ParamByName('idp').AsInteger:=qup.ExecSQL();
  156.                   ParamByName('idu').AsInteger:=quu.ExecSQL();
  157.                   //ParamByName('descripcion').AsString:=descripcion;
  158.                   ExecSQL();
  159.                   Free;
  160.                 end;
  161.                     SUCURSAL.CommitFreeAndNil(tr);
  162.  
  163.             except
  164.  
  165.  
  166.                 SUCURSAL.RollbackFreeAndNil(tr);
  167.                 exito:=false;
  168.  
  169.               end;
  170.               Result:=exito;
  171.           end;
  172.  
  173. end;


  • 0

#2 Wilson

Wilson

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.137 mensajes

Escrito 06 enero 2015 - 07:38

Aunque hay varias cosas que no me quedan claras, por ejemplo en el primer procedimiento, porqué liberas qtelefono y Telci?

Asumiendo que SUCURSAL es la conexión y que estás trabajando de modo desconectado (puesto que en tu código la abres para cada transacción), he intentado mejorar el código de tu primer procedimiento.



delphi
  1. function TServerMethods1.insertartelefonoscliente(numero, idtipotel: integer;
  2.   descripciontel: string): boolean;
  3. var
  4.   tr: TDBXTransaction;
  5. begin
  6.   if SUCURSAL.InTransaction then
  7.     raise Exception.Create('Hay una transacción pendiente');
  8.  
  9.   SUCURSAL.Open;
  10.   try
  11.     try
  12.       tr := SUCURSAL.BeginTransaction();
  13.       with qtelefono do
  14.       begin
  15.         Close;
  16.         ParamByName('numero').AsInteger := numero;
  17.         ParamByName('idtipotel').AsInteger := idtipotel;
  18.         ParamByName('descripcion').AsString := descripciontel;
  19.         ExecSQL();
  20.       // Free; // No entiendo porque lo liberas,  a que horas lo creas?
  21.       end
  22.       with telcli do
  23.       begin
  24.         Close;
  25.         ParamByName('idc').AsInteger := qucliente.ExecSQL();
  26.         ParamByName('idt').AsInteger := qut.ExecSQL();
  27.         ExecSQL();
  28.       // Free; // No entiendo porque lo liberas,  a que horas lo creas?
  29.       end;
  30.       SUCURSAL.CommitFreeAndNil(tr);
  31.       Result := True;
  32.     except
  33.       SUCURSAL.RollbackFreeAndNil(tr);
  34.     end;
  35.   finally
  36.     SUCURSAL.Close;
  37.   end;
  38. end;


  • 0

#3 giulichajari

giulichajari

    Advanced Member

  • Miembros
  • PipPipPip
  • 477 mensajes

Escrito 06 enero 2015 - 01:18

Me funciono a la perfeccion. No sabia lo de Free;.

Muchas gracias
  • 0

#4 Wilson

Wilson

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.137 mensajes

Escrito 06 enero 2015 - 03:04

Me alegra que hayas solucionado, el código se puede optimizar para que en caso de que algo ande mal (una excepción) puedas saberlo en el lado cliente, el bloque de código entre except y end de momento solo hace un RollBack y libera la transacción pero no hay forma de que el cliente se entere, para propagar la excepción y conocer el motivo de esta hay que agregar lo siguiente:



delphi
  1.     except
  2.       SUCURSAL.RollbackFreeAndNil(tr);
  3.       raise ; //Esto propaga la excepción
  4.     end;




No sabia lo de Free;.


Con todo respeto amigo, estás intentando desarrollar una aplicación de base de datos en tres capas y aún no tienes claros conceptos demasiado básicos del lenguaje como la creación y destrucción de objetos, eso es bastante peligroso, te exhorto  a que saques un tiempo y leas los conceptos básicos del lenguaje, podrías leer "La cara oculta de Delphi 4", creo que está disponible en la zona de descargas del foro o con una búsqueda en google.

Un cordial saludo.
  • 0

#5 giulichajari

giulichajari

    Advanced Member

  • Miembros
  • PipPipPip
  • 477 mensajes

Escrito 06 enero 2015 - 06:02

Tienes razon, de hecho he leido algunos temas en ese libro, por lo general consulto en foros o la documentacion de embarcadero, si buscas el componente query y el metodo free, por ej aparece aunque en ingles una documentacion. Esta vez el codigo lo encontre en internet, siempre miro ejemplos, pero es evidente que no es muy buena practica.

Saludos
  • 0




IP.Board spam blocked by CleanTalk.