Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Conexión con bases de datos (https://www.clubdelphi.com/foros/forumdisplay.php?f=2)
-   -   Problema de edición en SQLQuery (https://www.clubdelphi.com/foros/showthread.php?t=79360)

Jere_84 28-06-2012 00:12:12

Problema de edición en SQLQuery
 
Hola, estoy haciendo una prueba en delphi 2010 datasnap utilizando los componentes de la paleta DbExpress. El ejemplo consta de una carga de facturación y al momento de grabar se descuenta el stock en la tabla de artículos. Esta operación la estoy haciendo en la aplicación servidor en el ServerMethod correspondiente, en el evento AfterUpdateRecord del componente DataSetProvider.

Este es mi codigo:

Código Delphi [-]
var
  CodigoArtic: integer;
  CantidadArtic: double;
  oTempArticulos: TSQLQuery;
//..
  case UpdateKind of
    ukInsert: Begin  //si es una inserción
         if SourceDS.Name = 'SQLDataSetDetalle' then  //si el que pasa es un SQLDataSetDetalle
         begin
           if DeltaDS.FieldByName('CANTIDAD').Value > 0 then
           begin
             CodigoArtic:= DeltaDS.FieldByName('COD_ARTIC').AsInteger;
             CantidadArtic:= DeltaDS.FieldByName('CANTIDAD').AsFloat;
             oTempArticulos:= TSQLQuery.Create(nil);
             oTempArticulos.SQLConnection:= SQLConnectionMovimientos;
             oTempArticulos.Close;
             oTempArticulos.SQL.Clear;
             oTempArticulos.SQL.Add('Select * From "Articulos" Where CODIGO= ' + inttostr(CodigoArtic));
             oTempArticulos.Open;
             oTempArticulos.Edit; <----------ERROR
             oTempArticulos.FieldByName('CANTIDAD').AsFloat:= oTempArticulos.FieldByName('CANTIDAD').AsFloat - CantidadArtic;
             oTempArticulos.Post;
           end;
         end;
     End;

El Error dice: Project servidor.exe raised exception class EDatabaseError with message 'Cannot modify a read-only dataset'.

Elegí este foro porque no creo que la excepción tenga que ver con Datasnap, mas bien parecería que me falta aclarar algo del componente. Como dice el enunciado de la excepción "no se puede modificar un dataset de solo-lectura" pero lo cierto es que ni siquiera hay una propiedad ReadOnly en el SQLQuery. Bueno cualquier sugerencia es bienvenida, gracias de antemano.

olbeup 28-06-2012 08:43:31

Estoy haciendo pruebas con DBExpress y TSQLQuery no se debe utilizar, solo para hacer la SQL, debes de utilizar TClientDataSet en su defectos, ya que éste componente es el que lo controla todo, pero éste componente depende de TDataSetProvider y TSQLQuery, para realizar la SQL.

Un saludo.

olbeup 28-06-2012 09:15:07

No lo he probado, espero que te funcione
Código Delphi [-]
var
  CodigoArtic: Integer;
  CantidadArtic: Double;
  oSQLQry: TSQLQuery;
  oDSProvider: TDataSetProvider;
  oCDSet: TClientDataSet;
  ...
  case UpdateKing of
    ukInsert:
      begin
        if (SourceDS.Name = 'SQLDataSetDetalle') then
          if (DeltaDS.FieldByName('CANTIDAD').AsFloat > 0) then
          begin
            CodigoArtic   := DeltaDS.FieldByName('COD_ARTIC').AsInteger;
            CantidadArtic := DeltaDS.FieldByName('CANTIDAD').AsFloat;

            oSQLQry := TSQLQuery.Create(nil);
              oSQLQry.SQLConnection := SQLConnectionMovimientos;
              oSQLQry.SQL.Add('SELECT CANTIDAD FROM "Articulos" WHERE CODIGO = ' + IntToStr(CodigoArtic));

            oDSProvider := TDataSetProvider.Create(nil);
              oDSProvider.DataSet := oSQLQry;

            oCDSet := TClientDataSet.Create(nil);
              oCDSet.ProviderName := oDSProvider;

            oCDSet.Open;
            oCDSet.Edit;
            oCDSet.FieldByName('CANTIDAD').AsFloat := (oCDSet.FieldByName('CANTIDAD').AsFloat - CantidadArtic);
            oCDSet.Post;

            FreeAndNil(oCDSet);
            FreeAndNil(oDSProvider);
            FreeAndNil(oSQLQry);
          end;
      end;
  end;

Un saludo

Jere_84 28-06-2012 16:17:07

Resuelto
 
Leyendo en la ayuda encontré que el TSQLQuery solo podrá editar creando un comando SQL Update por lo menos esto en la versión 2010.

Cita:

There is no built-in editing support: you can only edit the data in an SQL query by explicitly creating an SQL UPDATE command or by connecting the dataset to a client dataset using a provider


La franja horaria es GMT +2. Ahora son las 07:15:40.

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