Delphi - TZTable con campos vacios y no NULOS

 
Vista:
sin imagen de perfil

TZTable con campos vacios y no NULOS

Publicado por Miguel Angel (4 intervenciones) el 07/05/2013 18:58:40
Hola,

llevo varios día con un problema que ha simple vista no debería de ser dificil de solucionar, pero aquí estoy sin saber que mas vueltas dar. Dicho problema me ha surgido con el componente TZTable del paquete de ZEOS.

Se trata de asignar un valor vacio, no NULO, a un determinado campo de tipo DBMemo. Pero al asignar la cadena vacia, el componente pone dicho campo con el valor NULL en la Base de datos (MySQL). No se trata de un problema de la estructura de la tabla, pues si la insercción se hace por codigo SQL funciona perfectamente.

Aquí dejo la función que utilizo para asignar este campo

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
procedure AsignarValor(tipo:integer; valor:String);
begin
   With zTable1 do
      try
         if not (State in [DsEdit, DsInsert]) then
            edit;
         case tipo of
           //Se pone el valor a NULL
           0:fieldByname('definicion2').Clear;
           //Se pone el valor VACIO no NULL, longitud=0
           1:fieldByname('definicion2').AsString='';
         else
           //Se asigna un determinado valor
           fieldByname('definicion2').AsString=Valor;
         end;
      finally
         try
            post;
         except
            On e:Exception do begin
               MessageDlg(E.Message, mtError, [mbOK], 0);
               cancel;
            end;
         end;
      end;
end;


la función falla cuando tipo=1, he intentado poner el caracter 0 (#0) en vez de dobles comillas, y en ese caso ya no retorna un valor NULL, pero esa opción no me sirve, por que la longitud del campo ya no es 0, si no 1.

Como ultima alternativa he actualizado a la ultima versión de los componentes ZEOS y continuo con el mismo problema.

Indicar que este mismo procedimiento esta funcionando sin ningun problema con los componentes ADO en una Base de datos de MSSQL

Gracias por su ayuda y un Saludo a todos
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
sin imagen de perfil
Val: 65
Oro
Ha mantenido su posición en Delphi (en relación al último mes)
Gráfica de Delphi

TZTable con campos vacios y no NULOS

Publicado por E.T. (1244 intervenciones) el 08/05/2013 18:12:29
Tu codigo me funciona bien a mi, solo cambie dos lineas que me marcan error, son estas

1
2
3
4
5
6
7
8
1:fieldByname('definicion2').AsString='';
la cambie por:
1:fieldByname('definicion2').AsString:='';
 
y
fieldByname('definicion2').AsString=Valor;
por
fieldByname('definicion2').AsString:=Valor;


Donde vez que te está mostrando null el campo, desde otra tabla? o desde mysqladministrator?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

TZTable con campos vacios y no NULOS

Publicado por Miguel Angel (4 intervenciones) el 09/05/2013 10:47:47
Hola E.T. gracias por responderme,

Ciertamente son dos errores sintacticos de transcripción en donde me salte los dos puntos de la asignación.

Aparte de estos errores, añado mas información sobre el problema en cuestion:

Trabajo con MySQL en un servidor local, accedo mediante PHPMYADMIN y la tabla con la que estoy trabajando tiene la siguiente estructura:

1
2
3
4
5
6
7
8
CREATE TABLE IF NOT EXISTS `articulos` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `codigo` char(15) COLLATE utf8_unicode_ci NOT NULL DEFAULT '',
  `nombre` char(50) COLLATE utf8_unicode_ci DEFAULT NULL,
  `descripcion` text COLLATE utf8_unicode_ci,
  PRIMARY KEY (`id`),
  UNIQUE KEY `PRIMARY_KEY` (`codigo`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;


Y ya desde la ventana de comandos del propio PHPMyADMIN ejecuto estos comandos

1
2
UPDATE `articulos` SET `descripcion`=NULL where `id`=5000;
UPDATE `articulos` SET `descripcion`='' where `id`=2325;


Al hacer un
1
Select * from `articulos` where `descripcion` is NULL;


me aparece entre otros registros el que su id=5000 pero no aparece el 2325

y al hacer un
1
Select * from `articulos` where `descripcion`='';


me aparece el id=2325 y no aparece el 5000

Esta es una de las formas de comprobar el estado de los campos.

Ya desde delphi para comprobar si un determinado campo es NULL, VACIO o contiene datos utilizo la siguiente funcion

1
2
3
4
5
6
7
8
9
10
procedure VerificarValorCampo;
begin
   With zTable1, fieldByname(fieldName) do
      if IsNull then
         ShowMessage('El campo es NULL')
      else if AsString='' then
         ShowMessage('El campo es VACIO')
      else
         ShowMessage('El campo contiene '+IntToStr(length(AsString))+' caracter/es');
end;


Como nota adicional, si las operaciones se realiza sobre el campo nombre de la tabla que es de tipo TWideStringField, todo funciona correctamente, se puede poner a NULL, VACIO o con datos y no hay mayor problema, y se detecta perfectamente, pero por el contrario si las operaciones se realiza en el campo descripcion de tipo TWideMemoField al poner el valor en vacio, automaticamen me lo asigna a NULL, no diferenciando entre vacio o NULL ni desde delphi ni desde el propio PHPMyADMIN
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 65
Oro
Ha mantenido su posición en Delphi (en relación al último mes)
Gráfica de Delphi

TZTable con campos vacios y no NULOS

Publicado por E.T. (1244 intervenciones) el 09/05/2013 19:34:17
Que tal, ya logré duplicar el error, tambien conseguí insertar una cadena vacia en el campo tipo text, que es tu campo descripcion, pero no se si la modificacion que hice sea correcta, deja plublico un mensaje en los foros de ZeosLib para ver si es un bug, o si fue creado de esa forma y te comento

EDIT:
Veo que ya publicaste un mensaje en el foro, deja continuo con el para ver que nos dicen
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

TZTable con campos vacios y no NULOS

Publicado por Miguel Angel (4 intervenciones) el 15/05/2013 16:54:03
Hola E.T., gracias por el interes mostrado en el tema,

Finalmente respondieron con una posible solucion desde el foro de ZEOS de donde podria estar el problema, aunque con lo alli comentado yo no he conseguido solucionarlo. Parece ser que se trata de un bug en los componentes ZEOS, Asi que habra que esperar a nuevas versiones :-)

Para quien le pueda interesar este error la solucion que alli indican se encuentra en el fichero
ZDbcCache.pas y en particular en la funcion:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
function TZRowAccessor.GetAsciiStream(ColumnIndex: Integer;
  var IsNull: Boolean): TStream;
var
  TempBlob: IZBlob;
begin
{$IFNDEF DISABLE_CHECKING}
  CheckColumnConvertion(ColumnIndex, stAsciiStream);
{$ENDIF}
  TempBlob := GetBlobObject(FBuffer, ColumnIndex);
  if (TempBlob <> nil) and not TempBlob.IsEmpty then
    Result := TempBlob.GetStream
  else Result := nil;
  IsNull := Result = nil;
end;


En la linea :
1
if (TempBlob <> nil) and not TempBlob.IsEmpty then


la condición not TempBlob.IsEmpty es la que provoca dicho error, bastaría con eliminarla.

No obstante y dado que yo tenia que solucionar el problema que me suponía este bug, he optado por tratar por igual un campo vacio o NULL dentro de mi propia aplicación

De nuevo agradecer a E.T. la colaboracion y el tiempo empleado en resolver este asunto
Un Saludo a todos
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 65
Oro
Ha mantenido su posición en Delphi (en relación al último mes)
Gráfica de Delphi

TZTable con campos vacios y no NULOS

Publicado por E.T. (1244 intervenciones) el 15/05/2013 17:30:02
Hola, fui yo quien publicó esa pseudo solucion en el foro, y lo digo asi porque no creo que sea la solución correcta, pero funciona, te recomiendo usar lo mas que se pueda el TZQuery, es un poco más de trabajo pero es mejor opción
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar