1

さて、状況は次のとおりです。 cboTipDocIden という名前の TComboBox が 1つと、 txtDocIdenSolicという名前の TEdit が 1 つあります。

cboTipDocIden の値は次のとおりです"1.DNI","2.RUC"

コンポーネントTUniQueryq_DetSolicitanteと呼ばれます。

SQL 文のターゲットは次のとおりです。

SELECT oper_solicitante.id_solicitante, oper_solicitante.ape_pat, oper_solicitante.ape_mat,
       oper_solicitante.nombre, oper_solicitante.direcc_idtipcalle, oper_solicitante.direcc_nombrecalle,
       oper_solicitante.direcc_nro, oper_solicitante.idvinculo_fk
FROM oper_solicitante
WHERE oper_solicitante.tipDocIden = :TipDocIden AND
      oper_solicitante.nroDocIden = :NroDocIden

SQL はtxtDocIdenSolicOnExitのイベントで実行されます。コードは次のとおりです。

procedure TForm1.txtDocIdenSolicExit(Sender: TObject);
var
  TipDocIden, NroDocIden:string;
begin
  if(length(txtDocIdenSolic.Text)>0) then
  begin
    TipDocIden:=chr(39)+copy(cboTipDocIden.Text,1,1)+chr(39);
    NroDocIden:=chr(39)+trim(txtDocIdenSolic.Text)+chr(39);
    q_DetSolicitante.Close;
    q_DetSolicitante.Params[0].AsString:=TipDocIden;
    q_DetSolicitante.Params[1].AsString:=NroDocIden;
    q_DetSolicitante.Open;

    if(length(q_DetSolicitante.FieldByName('id_solicitante').AsString)=0) then
    begin
      stbar.Panels[0].text:='Nuevo Solicitante...';
      txtApePat.SetFocus;
    end
    else
    begin
      stbar.Panels[0].Text:='Solicitante Reiterativo...';
      txtApePat.Text:=q_DetSolicitante.FieldByName('ape_pat').AsString;
      txtApeMat.Text:=q_DetSolicitante.FieldByName('ape_mat').AsString;
      txtNombre.Text:=q_DetSolicitante.FieldByName('nombre').AsString;
    end;
  end
  else
    msg1.Execute;
end;

最後に、テーブル構造は次のとおりです。

CREATE TABLE `oper_solicitante` (
  `id_solicitante` int(11) NOT NULL,
  `tipDocIden` char(1) NOT NULL,
  `nroDocIden` varchar(11) NOT NULL,
  `ape_pat` varchar(50) NOT NULL,
  `ape_mat` varchar(50) NOT NULL,
  `nombre` varchar(50) NOT NULL,
  `direcc_idtipcalle` int(11) NOT NULL,
  `direcc_nombrecalle` varchar(80) NOT NULL,
  `direcc_nro` varchar(15) NOT NULL,
  `idvinculo_fk` int(11) NOT NULL,
  PRIMARY KEY (`id_solicitante`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

さて、SQL は Delphi 内でゼロ行を返しますが、リテラル値のパラメータを変更すると SQL が機能します。

有益な助けをありがとう。

4

1 に答える 1

2

chr(39)パラメータ値の前後の文字を削除します。を使用Params[].AsStringすると、データベースドライバーがそれらを適切に引用できるようになり、それらを追加(2倍)するため、クエリが失敗します。

TipDocIden:= copy(cboTipDocIden.Text,1,1);
NroDocIden:= trim(txtDocIdenSolic.Text);
q_DetSolicitante.Close;
q_DetSolicitante.Params[0].AsString := TipDocIden;
q_DetSolicitante.Params[1].AsString := NroDocIden;
q_DetSolicitante.Open;
于 2013-01-12T17:12:34.817 に答える