Bueno, pues dado el asunto de caracter importante, escribí una pequeña función que nos retornaría el número de registros de una consulta, pasándole como parámetro la propiedad SQL o SelectSQL en el caso de los DataSets. Es básica claro, por eso si alguien tiene alguna sugerencia bienvenida sea. Aquí está:
Código Delphi
[-]
function RecordCountInQuery(SQL: TStrings): Integer;
var
P, I, C: SmallInt;
StrAux, TableName, SearchCondition: string;
Q: TMDOQuery;
begin
TableName := '';
P := Pos('FROM', UpperCase(SQL.Text));
if P > 0 then begin
StrAux := Copy(SQL.Text, P+4, Length(SQL.Text)-(P+3));
C := 0;
for I := 1 to Length(StrAux) do begin
if StrAux[i] = '"' then
Inc(C);
case C of
1:
TableName := TableName + StrAux[i];
2:
begin
TableName := TableName + StrAux[i];
Break;
end
end;
end
end;
SearchCondition := '';
P := Pos('WHERE', UpperCase(SQL.Text));
if P > 0 then begin
StrAux := Copy(SQL.Text, P+5, Length(SQL.Text)-(P+4));
P := Pos('GROUP', UpperCase(StrAux));
if P = 0 then
P := Pos('ORDER', UpperCase(StrAux));
if P = 0 then
SearchCondition := Trim(StrAux)
else
SearchCondition := Trim(Copy(StrAux, 1, P-1));
end;
Q := TMDOQuery.Create(DM);
Q.Database := DM.MDODB; Q.Transaction := DM.MDOTranAction; if SearchCondition = '' then
Q.SQL.Text := 'SELECT COUNT(*) "RecordCount" FROM '+TableName
else
Q.SQL.Text := 'SELECT COUNT(*) "RecordCount" FROM '+TableName+' WHERE '+SearchCondition;
Q.Open;
Result := Q.FieldByName('RecordCount').AsInteger;
Q.Close;
Q.Free;
end;
Como se pueden dar cuenta, esta función extrae el nombre de la tabla o vista siempre que esta se encuentre entre comillas, así que habría que hacer una pequeña modificación para otros casos.