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 // Nombre de tabla en consulta (esto funciona siempre que las
// tablas estén encerradas entre comillas)
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;
// Expresión condicional
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;
// Consulta del número de registros
Q := TMDOQuery.Create(DM);
Q.Database := DM.MDODB; // Componente de base de datos
Q.Transaction := DM.MDOTranAction; // Transacción
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.