ZeosDBO – Erro “0 record(s) updated. Only one record should have been updated”

Muitas pessoas me enviam questionamentos sobre esse erro causado pelo ZeosDBO, principalmente quando trabalhamos com objetos “table” ao invés de querys.

No desenvolvimento do ZeosDBO muitas coisas ficaram para trás, entre elas, uma exceção criada (sabe-se lá porque motivo) que deveria ser habilitada somente quando a variável global WITH_VALIDATE_UPDATE_COUNT estivesse presente.

Com isso, todas vezes que você abre um registro com “TableObject.Edit” e não faz nenhuma alteração nos campos deste registro, a exceção é acionada com a mensagem “0 record(s) updated. Only one record should have been updated“.

Para remover esta exceção você precisa editar dois arquivos, o src\component\ZSQLUpdate.pas e o

No arquivo src\component\ZSQLUpdate.pas, na linha 829 remova o bloco abaixo selecionado.

No arquivo src\dbc\ZDbcGenericResolver.pas você deve editar na linha 872 e também remover o código selecionado.

Depois, é necessário recompilar, construir (build) e reinstalar o ZeosDBO no seu Delphi.

DELPHI – Limpar spool de impressão (esvaziar spooler)

Function GetCurrentPrinterHandle: THandle;
      Const
        Defaults: TPrinterDefaults = (
          pDatatype : nil;
          pDevMode  : nil;
          DesiredAccess : PRINTER_ACCESS_USE or PRINTER_ACCESS_ADMINISTER
    );
      Var
        Device, Driver, Port : array[0..255] of char;
        hDeviceMode: THandle;
      Begin { GetCurrentPrinterHandle }
        Printer.GetPrinter(Device, Driver, Port, hDeviceMode);
        If not OpenPrinter(@Device, Result, @Defaults) Then
          RaiseLastWin32Error;
      End; { Pega o handle da impressora padrão }

    { mata todos os trabalhos da impressora }
    Procedure PurgeJobsOnCurrentPrinter;
      Var
        hPrinter: THandle;
      Begin
        hPrinter:= GetCurrentPrinterHandle;
        try
          If not WinSpool.SetPrinter( hPrinter, 0, nil,
    PRINTER_CONTROL_PURGE )
          Then
            RaiseLastWin32Error;
        finally
          ClosePrinter( hPrinter );
        end;
      End;

Chame utilizando a procedure, assim…

PurgeJobsOnCurrentPrinter;

DELPHI – Imprimindo “cupom” direto na impressora utilizando o objeto TPrinter

procedure Imprimir;
var
 iPrinter: TPrinter;
 PrinterY: Integer;
begin
  iPrinter:= TPrinter.Create;
  PrinterY:= 0;
  iPrinter.Title:= 'MEUSISTEMA - Cupom';

  //Se a impressora estiver imprimindo, espera
  While Printer.Printing Do
  Sleep(100);

  iPrinter.BeginDoc;
  iPrinter.Canvas.Font.Name:='Courier';
  iPrinter.Canvas.Font.Style:=[fsBold];
  iPrinter.Canvas.Font.Size:=13;

  iPrinter.Canvas.Font.Size:=18;
  iPrinter.Canvas.TextOut(0,PrinterY,'CUPOM TESTE SISTEMA');
  Inc(PrinterY,38);

  iPrinter.Canvas.Font.Size:=13;
  iPrinter.Canvas.TextOut(0,PrinterY,'TESTE'); Inc(PrinterY,30);
  iPrinter.Canvas.TextOut(0,PrinterY,'--------------------'); Inc(PrinterY,30);
  iPrinter.Canvas.Font.Size:= 18;
  iPrinter.Canvas.TextOut(0,PrinterY,'OUTRO TESTE');
  Inc(PrinterY,50);

  iPrinter.EndDoc;
  iPrinter.Free;

DELPHI – Como aplicar atributos a um arquivo

Com esta dica, você pode aplicar o arquivo como somente leitura, ou então tornar o arquivo oculto.
function FileSetAttr(const FileName: string; Attr: Integer): Integer;

Exemplo:

FileSetAttr ('C:\logo.sys',0);

Onde Attr:Interger:

0=Sem Atributos;
1=Somente Leitura;
2=Oculto;
3=Somente Leitura e Oculto;
4=Sistema;
5=Somente Leitura e Sistema;
6=Sistema e Oculto;
7=Somente Leitura,Sistema e Oculto;

DELPHI – Copiar arquivos usando a ShellApi do Windows

function ProcessArquivo(const Origem, Destino : string; Operacao, Modo:Integer) : Boolean;
  // Requer a unit ShellApi na clausula uses da unit
  Const
  Aborted : Boolean = False;
  var
  shfo : TSHFileOpStruct;
  begin
  FillChar(shfo,SizeOf(shfo),$0);
  with shfo do
  begin
  if Operacao > 2 then
  begin
  operacao := 2;
  end;
  if Modo > 5 then
  begin
  modo := 1;
  end;
  case operacao of
  1: wFunc := FO_MOVE;
  2: wFunc := FO_COPY;
  end;
  pFrom := Pchar(Origem);
  pTo := Pchar(Destino);
  case Modo of
  1: fFlags := FOF_SILENT;
  2: fFlags := FOF_ALLOWUNDO or FOF_FILESONLY;
  3: fFlags := FOF_RENAMEONCOLLISION;
  4: fFlags := FOF_NOCONFIRMATION;
  5: fFlags := FOF_SIMPLEPROGRESS;
  end;
  end;
  Result := (SHFileOperation(shfo)= 0) and (not Aborted);
  end; 

DELPHI – Tamanho de um arquivo

function TamArquivo(Arquivo: string): Integer;
begin
with TFileStream.Create(Arquivo, fmOpenRead or fmShareExclusive) do
try
Result := Size;
finally
Free;
end;
end;

Solução enviada por Dennis Göhlert (Berlin/German):

 


function GetFileSize(const szFile: String): Int64;
var
 fFile: THandle;
 wfd: TWIN32FINDDATA;
begin
 result := 0;
 if not FileExists(szFile) then exit;
 fFile := FindFirstfile(pchar(szFile),wfd);
 if fFile = INVALID_HANDLE_VALUE then exit;
 result := (wfd.nFileSizeHigh*(MAXDWORD))+wfd.nFileSizeLow;
 windows.FindClose(fFile);
end;

DELPHI – BASE 64


const
Codes64 = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz+/';

function Encode64(S: string): string;
var
i: Integer;
a: Integer;
x: Integer;
b: Integer;
begin
Result := '';
a := 0;
b := 0;
for i := 1 to Length(s) do
begin
x := Ord(s[i]);
b := b * 256 + x;
a := a + 8;
while a >= 6 do
begin
a := a - 6;
x := b div (1 shl a);
b := b mod (1 shl a);
Result := Result + Codes64[x + 1];
end;
end;
if a > 0 then
begin
x := b shl (6 - a);
Result := Result + Codes64[x + 1];
end;
end;

function Decode64(S: string): string;
var
i: Integer;
a: Integer;
x: Integer;
b: Integer;
begin
Result := '';
a := 0;
b := 0;
for i := 1 to Length(s) do
begin
x := Pos(s[i], codes64) - 1;
if x >= 0 then
begin
b := b * 64 + x;
a := a + 6;
if a >= 8 then
begin
a := a - 8;
x := b shr a;
b := b mod (1 shl a);
x := x mod 256;
Result := Result + chr(x);
end;
end
else
Exit;
end;
end;

DELPHI – Busca utilizando caracteres (COLLATE) no MS ACCESS

Sabendo-se que a busca ignorando caracteres NÃO FUNCIONA no Microsoft Access, a solução foi criar múltiplos parametros de busca, utilizando a formula a seguir (desenvolvida em Pascal).

//busca inteligente por nomes
strBuscaNome:= '([mensalistas].NomeCliente LIKE "%'+strBusca+'%")';
//áäàãâÁÄÀÃÂ
strBuscaNome:=strBuscaNome+' OR ([mensalistas].NomeCliente LIKE "%'+StringReplace(strBusca,'a','á',[rfReplaceAll])+'%")';
strBuscaNome:=strBuscaNome+' OR ([mensalistas].NomeCliente LIKE "%'+StringReplace(strBusca,'a','ä',[rfReplaceAll])+'%")';
strBuscaNome:=strBuscaNome+' OR ([mensalistas].NomeCliente LIKE "%'+StringReplace(strBusca,'a','à',[rfReplaceAll])+'%")';
strBuscaNome:=strBuscaNome+' OR ([mensalistas].NomeCliente LIKE "%'+StringReplace(strBusca,'a','ã',[rfReplaceAll])+'%")';
strBuscaNome:=strBuscaNome+' OR ([mensalistas].NomeCliente LIKE "%'+StringReplace(strBusca,'a','â',[rfReplaceAll])+'%")';
strBuscaNome:=strBuscaNome+' OR ([mensalistas].NomeCliente LIKE "%'+StringReplace(strBusca,'A','Á',[rfReplaceAll])+'%")';
strBuscaNome:=strBuscaNome+' OR ([mensalistas].NomeCliente LIKE "%'+StringReplace(strBusca,'A','Ä',[rfReplaceAll])+'%")';
strBuscaNome:=strBuscaNome+' OR ([mensalistas].NomeCliente LIKE "%'+StringReplace(strBusca,'A','À',[rfReplaceAll])+'%")';
strBuscaNome:=strBuscaNome+' OR ([mensalistas].NomeCliente LIKE "%'+StringReplace(strBusca,'A','Ã',[rfReplaceAll])+'%")';
strBuscaNome:=strBuscaNome+' OR ([mensalistas].NomeCliente LIKE "%'+StringReplace(strBusca,'A','Â',[rfReplaceAll])+'%")';
//éëèêÉËÈÊ
strBuscaNome:=strBuscaNome+' OR ([mensalistas].NomeCliente LIKE "%'+StringReplace(strBusca,'e','é',[rfReplaceAll])+'%")';
strBuscaNome:=strBuscaNome+' OR ([mensalistas].NomeCliente LIKE "%'+StringReplace(strBusca,'e','ë',[rfReplaceAll])+'%")';
strBuscaNome:=strBuscaNome+' OR ([mensalistas].NomeCliente LIKE "%'+StringReplace(strBusca,'e','è',[rfReplaceAll])+'%")';
strBuscaNome:=strBuscaNome+' OR ([mensalistas].NomeCliente LIKE "%'+StringReplace(strBusca,'e','ê',[rfReplaceAll])+'%")';
strBuscaNome:=strBuscaNome+' OR ([mensalistas].NomeCliente LIKE "%'+StringReplace(strBusca,'E','É',[rfReplaceAll])+'%")';
strBuscaNome:=strBuscaNome+' OR ([mensalistas].NomeCliente LIKE "%'+StringReplace(strBusca,'E','Ë',[rfReplaceAll])+'%")';
strBuscaNome:=strBuscaNome+' OR ([mensalistas].NomeCliente LIKE "%'+StringReplace(strBusca,'E','È',[rfReplaceAll])+'%")';
strBuscaNome:=strBuscaNome+' OR ([mensalistas].NomeCliente LIKE "%'+StringReplace(strBusca,'E','Ê',[rfReplaceAll])+'%")';
//íïìîÍÏÌÎ
strBuscaNome:=strBuscaNome+' OR ([mensalistas].NomeCliente LIKE "%'+StringReplace(strBusca,'i','í',[rfReplaceAll])+'%")';
strBuscaNome:=strBuscaNome+' OR ([mensalistas].NomeCliente LIKE "%'+StringReplace(strBusca,'i','ï',[rfReplaceAll])+'%")';
strBuscaNome:=strBuscaNome+' OR ([mensalistas].NomeCliente LIKE "%'+StringReplace(strBusca,'i','ì',[rfReplaceAll])+'%")';
strBuscaNome:=strBuscaNome+' OR ([mensalistas].NomeCliente LIKE "%'+StringReplace(strBusca,'i','î',[rfReplaceAll])+'%")';
strBuscaNome:=strBuscaNome+' OR ([mensalistas].NomeCliente LIKE "%'+StringReplace(strBusca,'I','Í',[rfReplaceAll])+'%")';
strBuscaNome:=strBuscaNome+' OR ([mensalistas].NomeCliente LIKE "%'+StringReplace(strBusca,'I','Ï',[rfReplaceAll])+'%")';
strBuscaNome:=strBuscaNome+' OR ([mensalistas].NomeCliente LIKE "%'+StringReplace(strBusca,'I','Ì',[rfReplaceAll])+'%")';
strBuscaNome:=strBuscaNome+' OR ([mensalistas].NomeCliente LIKE "%'+StringReplace(strBusca,'I','Î',[rfReplaceAll])+'%")';
//óöòõôÓÖÒÕÔ
strBuscaNome:=strBuscaNome+' OR ([mensalistas].NomeCliente LIKE "%'+StringReplace(strBusca,'o','ó',[rfReplaceAll])+'%")';
strBuscaNome:=strBuscaNome+' OR ([mensalistas].NomeCliente LIKE "%'+StringReplace(strBusca,'o','ö',[rfReplaceAll])+'%")';
strBuscaNome:=strBuscaNome+' OR ([mensalistas].NomeCliente LIKE "%'+StringReplace(strBusca,'o','ò',[rfReplaceAll])+'%")';
strBuscaNome:=strBuscaNome+' OR ([mensalistas].NomeCliente LIKE "%'+StringReplace(strBusca,'o','õ',[rfReplaceAll])+'%")';
strBuscaNome:=strBuscaNome+' OR ([mensalistas].NomeCliente LIKE "%'+StringReplace(strBusca,'o','ô',[rfReplaceAll])+'%")';
strBuscaNome:=strBuscaNome+' OR ([mensalistas].NomeCliente LIKE "%'+StringReplace(strBusca,'O','Ó',[rfReplaceAll])+'%")';
strBuscaNome:=strBuscaNome+' OR ([mensalistas].NomeCliente LIKE "%'+StringReplace(strBusca,'O','Ö',[rfReplaceAll])+'%")';
strBuscaNome:=strBuscaNome+' OR ([mensalistas].NomeCliente LIKE "%'+StringReplace(strBusca,'O','Ò',[rfReplaceAll])+'%")';
strBuscaNome:=strBuscaNome+' OR ([mensalistas].NomeCliente LIKE "%'+StringReplace(strBusca,'O','Õ',[rfReplaceAll])+'%")';
strBuscaNome:=strBuscaNome+' OR ([mensalistas].NomeCliente LIKE "%'+StringReplace(strBusca,'O','Ô',[rfReplaceAll])+'%")';
//úüùûÚÜÙÛ
strBuscaNome:=strBuscaNome+' OR ([mensalistas].NomeCliente LIKE "%'+StringReplace(strBusca,'u','ú',[rfReplaceAll])+'%")';
strBuscaNome:=strBuscaNome+' OR ([mensalistas].NomeCliente LIKE "%'+StringReplace(strBusca,'u','ü',[rfReplaceAll])+'%")';
strBuscaNome:=strBuscaNome+' OR ([mensalistas].NomeCliente LIKE "%'+StringReplace(strBusca,'u','ù',[rfReplaceAll])+'%")';
strBuscaNome:=strBuscaNome+' OR ([mensalistas].NomeCliente LIKE "%'+StringReplace(strBusca,'u','û',[rfReplaceAll])+'%")';
strBuscaNome:=strBuscaNome+' OR ([mensalistas].NomeCliente LIKE "%'+StringReplace(strBusca,'U','Ú',[rfReplaceAll])+'%")';
strBuscaNome:=strBuscaNome+' OR ([mensalistas].NomeCliente LIKE "%'+StringReplace(strBusca,'U','Ü',[rfReplaceAll])+'%")';
strBuscaNome:=strBuscaNome+' OR ([mensalistas].NomeCliente LIKE "%'+StringReplace(strBusca,'U','Ù',[rfReplaceAll])+'%")';
strBuscaNome:=strBuscaNome+' OR ([mensalistas].NomeCliente LIKE "%'+StringReplace(strBusca,'U','Û',[rfReplaceAll])+'%")';
//çÇ
strBuscaNome:=strBuscaNome+' OR ([mensalistas].NomeCliente LIKE "%'+StringReplace(strBusca,'c','ç',[rfReplaceAll])+'%")';
strBuscaNome:=strBuscaNome+' OR ([mensalistas].NomeCliente LIKE "%'+StringReplace(strBusca,'C','Ç',[rfReplaceAll])+'%")';