0

MYSQL データベースからデータを取得して表示する必要があるフォームがあります。
私が作成した SQL コードは、MYSQL 内で実行しようとしたため、正常に動作します。

また、SQL データを取得して表示するために、別のフォーム内で、私のフォームと同様の形式のコードを使用しました。コードは他の形式で完全に機能します。
ただし、このフォームのコードは、SQL テーブルからデータを受信/表示していないようです。

OnShowフォームのイベント用に記述されたコードのスニペットを次に示します。

procedure TfrmEditBooking.FormShow(Sender: TObject);  
var  
  CustName: string;  
begin  
  if SelectedID > 0 then  
  begin  
    with frmBookingData.ADOQuery1 do  
    begin  
      Open;    
      SQL.Clear;  
      SQL.Add('SELECT Name, Surname ' +
              'FROM customers_main ' +
              'WHERE customers_main.idcustomers_main ' +
              'IN ' +
              '(SELECT bookings_main.customers_main_idcustomers_main ' +
              'FROM bookings_main ' +
              'WHERE bookings_main.idbookings_main = ' + IntToStr(SelectedID) + ')');
      ExecSQL;  
      CustName := FieldByName('Surname').AsString + ' ' + FieldByName('Name').AsString;  
      Label1.Caption := CustName;  
      Close;  
    end;  
  end;  
end;
4

2 に答える 2

1

データセットへのカーソルを受け取ることが予期されていない場合は、'execsql' を使用します (つまり、'update'、'insert'、および 'delete' ステートメントでは 'execsql' を使用しますが、'select' では使用しません)。

「execsql」コマンドを「open」に置き換え、「sql.clear」の前の「open」を削除する必要があります。

結合を使用する必要がある場合は、サブクエリを使用しないでください。

あなたのコードは次のようになるべきだと思います

procedure TfrmEditBooking.FormShow(Sender: TObject);
begin
 if SelectedID > 0 then
  with frmBookingData.ADOQuery1 do
   begin
    SQL.Clear;
    SQL.Add ('SELECT Name, Surname ');
    sql.add ('FROM customers_main inner join bookings_main');
    sql.add ('on customers_main.idcustomers_main = ');     
    sql.add ('bookings_main.customers_main_idcustomers_main');
    sql.add ('where bookings_main.idbookings_main = :p1');
    sql.params[0].asinteger:= SelectedID;
    open;  
    Label1.Caption := fieldbyname ('name').asstring + ' ' +
                      fieldbyname ('surname').asstring;
    Close;
   end;
end;
于 2013-03-24T11:06:44.110 に答える
0

これを実行するには、次のように変更する必要があります

procedure TfrmEditBooking.FormShow(Sender: TObject);
var
  CustName: string;
begin
  if SelectedID > 0 then
    begin
      with frmBookingData.ADOQuery1 do
        begin
          Close; // close first
          SQL.Clear;
          SQL.Add(
            'SELECT Name, Surname '+
            'FROM customers_main '+
            'WHERE customers_main.idcustomers_main '+
            'IN '+
            '(SELECT bookings_main.customers_main_idcustomers_main '+
            'FROM bookings_main '+
            'WHERE bookings_main.idbookings_main = '+IntToStr(SelectedID)+')');
          Open; // open the query
          if not Eof then
            CustName := FieldByName('Surname').AsString+' '+FieldByName('Name').AsString
          else
            CustName := 'not found';
          Close; // close when finished
        end;
      Label1.Caption := CustName;
    end;
end;

frmBookingData.ADOQuery1しかし、すでに何か別のものに使用されている場合は、いくつかの(負の)副作用が発生するはずです

于 2013-03-24T12:01:00.060 に答える