Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Campo Booleano en MySQL (https://www.clubdelphi.com/foros/showthread.php?t=71257)

cmfab 09-12-2010 23:19:19

Campo Booleano en MySQL
 
Alguien me puede indicar como se define un campo Booleano en MySQL, osea cual es su simbolo o descripcion en la estructura de la BD y que informacion guarda True o False ó 0 y 1. como poder usar checkboxes en una rejilla de datos para representarlo. Desde ya gracias

rhino0nt 10-12-2010 01:47:13

Caompo boolean en MySQL
 
Otra razón para utilizar PostgreSQL.

Tipos
BOOL, BOOLEAN

Este tipo no existe en MySQL (al menos no hasta la versión 5.5) en si son una representación para TINYINT(1). Un 0 es considerado Falso y cualquier otro valor es considerado TRUE.

Una forma de emular un tipo boolean es con ENUM('False', 'True') esto te permite utilizar ambas cadenas en tus sentencias SQL, y MySQL almacenará el campo internamente como integer donde False = 0 y True = 1 basándose en el orden en que están especificadas con ENUM.

Espero que esto te sea de utilidad.

cecam 10-12-2010 10:38:18

Como bien comenta rhino0nt en la bdd se define como TINYINT(1).

Después en el Delphi, usamos Zeos, y en la unit ZAbstractRODataset tengo una pequeña modificación en la siguiente función:
Código:

procedure TZAbstractRODataset.InternalInitFieldDefs;
var
  I, J, Size: Integer;
  AutoInit: Boolean;
  FieldType: TFieldType;
  ResultSet: IZResultSet;
  FieldName: string;
  FName: string;
begin
  FieldDefs.Clear;
  ResultSet := Self.ResultSet;
  AutoInit := ResultSet = nil;

  try
    { Opens an internal result set if query is closed. }
    if AutoInit then
    begin
      CheckSQLQuery;
      CheckConnected;
      ResultSet := CreateResultSet(FSQL.Statements[0].SQL, 0);
    end;
    if not Assigned(ResultSet) then
      raise Exception.Create(SCanNotOpenResultSet);

    { Reads metadata from resultset. }

    with ResultSet.GetMetadata do
    begin
      if GetColumnCount > 0 then for I := 1 to GetColumnCount do
      begin
        FieldType := ConvertDbcToDatasetType(GetColumnType(I));

        if FieldType in [ftString, ftWidestring, ftBytes] then
          Size := GetPrecision(I)
        else Size := 0;

        //TinyInt(1)= SmallInt = Boolean
        if  (  (FieldType=ftSmallInt)
            or (FieldType=ftInteger)
            or (FieldType=ftLargeint)
            )
        and (GetPrecision(I)=1)
        then FieldType:=ftBoolean;
        //TinyInt(1)= SmallInt = Boolean


        J := 0;
        FieldName := GetColumnLabel(I);
        FName := FieldName;
        while FieldDefs.IndexOf(FName) >= 0 do
        begin
          Inc(J);
          FName := Format('%s_%d', [FieldName, J]);
        end;

        with TFieldDef.Create(FieldDefs, FName, FieldType,
          Size, False, I) do
        begin
          {$IFNDEF FPC}
{$IFNDEF FOSNOMETA}
          Required := IsWritable(I) and (IsNullable(I) = ntNoNulls);
{$ENDIF}
          {$ENDIF}
{$IFNDEF FOSNOMETA}
          if IsReadOnly(I) then Attributes := Attributes + [faReadonly];
          Precision := GetPrecision(I);
{$ENDIF}
          DisplayName := FName;
        end;
      end;
    end;

  finally
    { Closes localy opened resultset. }
    if AutoInit then
    begin
      if ResultSet <> nil then
      begin
        ResultSet.Close;
        ResultSet := nil;
      end;
      if Statement <> nil then
      begin
        Statement.Close;
        Statement := nil;
      end;
    end;
  end;
end;

Recompilamos las Zeos, y ya podemos usar los Tinyint(1) como si fueran ftBoolean, incluso en diseño.

Saludos!!

cmfab 10-12-2010 13:52:43

Muchas gracias a ambos, me sirve de gran utilidad. disculpen por mis agradecimientos tardíos pero no estaba en el trabajo. gracias. un saludo

rgstuamigo 11-12-2010 16:00:45

Algunas referencias al respecto>
http://dev.mysql.com/doc/refman/5.0/...an-values.html
http://dev.mysql.com/doc/refman/5.0/...umn-types.html
http://www.conclase.net/mysql/curso/...ap=005#005_BIT
Saludos...;)

adrall 29-12-2010 11:40:01

Puedes usar el tipo BIT que solo admite CEROS i UNOS.


La franja horaria es GMT +2. Ahora son las 04:31: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