2014-06-06 7 views
0

두 개의 데이터 모듈, TPAymentDataModule 및 TJobEditDataModule이 있습니다. 하나 개의 데이터 모듈에서 나는 데이터베이스를 업데이트하기 위해 다른 모듈에서 특정 TADOQuery를 호출 할 수 있습니다 가 (이 코드 조각 TPaymentDataModule에) :델파이 : 다른 모듈에서 호출 된 TADOQuery의 필드는 갑자기 기본값을가집니다.

procedure TPaymentDataModule.ForceOrdersToComplete; 
begin 
    With PaymentGroupContentQuery do 
    begin 
    if IsEmpty then exit; 
    First; 
    JobEditDataModule.OrderEditQuery.Active:=true; 
    JobEditDataModule.JobEditQuery.Active := true; 

    while not eof do 
    begin 

     // get all orders that refer to this payment group 
     JobEditDataModule.OrderEditQuery.Parameters.ParamValues['orderId'] := 
     PaymentGroupContentQueryorder_Id.Value; 
     JobEditDataModule.OrderEditQuery.Active:=true; 
     JobEditDataModule.OrderEditQuery.Edit; 

     // and try to modify their status 
     JobEditDataModule.OrderEditQueryorder_status_id.AsInteger := 2; 
    Next; 
    end; 
end; 
end; 

OrderEditQueryOrder_status_id 필드가있는 OnValidate 이벤트 핸들러 :

procedure TJobEditDataModule.OrderEditQueryorder_status_idValidate(Sender: TField); 
begin 
    if (not Self.IsNewJobStatusPermissible(OrderEditQueryorder_status_id.OldValue, 
    OrderEditQueryorder_status_id.NewValue)) then 
    begin 
    raise Exception.CreateFmt('Cannot modify status of order %s.', [   OrderEditQueryOrder_Name.AsString ]); 
    Abort; 
end; 
end; 

모두 제대로 작동하는 것 같다,하지만 때:

는 (: TJobEditDataModule이 코드 조각은 다른 모듈에)처리기가 충돌하면 모든 필드에 갑자기 기본값이 생겨 코드가 실패하게됩니다. 쿼리가 Create인데 싱글 톤으로 사용하지 않기 때문에 사용할 수있는 싱글 톤 쿼리가 하나뿐이기 때문에 이벤트 처리기의 Sender이 동일한 쿼리 인스턴스를 가리켜 야합니다.

하지만 델파이를 처음 접했을 때 궁금해하고 있습니다. 왜 여기서 잘못 될까요? 난 당신이 DB에 편집 Post 할 필요가 착각하고 있지 않다 경우

답변

1

는 :

procedure TPaymentDataModule.ForceOrdersToComplete; 
begin 
    .. 
    while not eof do 
    begin 
     // get all orders that refer to this payment group 
     JobEditDataModule.OrderEditQuery.Parameters.ParamValues['orderId'] := 
     PaymentGroupContentQueryorder_Id.Value; 
     JobEditDataModule.OrderEditQuery.Active:=true; 
     JobEditDataModule.OrderEditQuery.Edit; 

     // and try to modify their status 
     JobEditDataModule.OrderEditQueryorder_status_id.AsInteger := 2; 

     // Commit the changes to the DB here 
     JobEditDataModule.OrderEditQuery.Post; 

     Next; 
    end; 
end; 
+0

감사 Graymatter을, 나는이 줄을 추가하는 것을 잊었다 그러나 문제는 코드도 때문에 그것에 도달하지 않았다이다. 다른 모듈에서 유효성 검증 실패. 이상하게도'ForceOrdersToComplete' 메소드를'JobEditDataModule'으로 옮겼을 때, 유효성 검사가 올바르게 작동하기 시작했습니다. 필드에 대한 참조가 데이터 모듈간에 손실 된 것 같습니다. – AunAun

+0

@ user3243551 : 질문에 모든 세부 정보를 포함 시키십시오. 그렇게하지 않으면 다른 사람의 시간을 낭비하게됩니다. SSCCE를 만들려고 시도하십시오 (문제가 계속 나타나는 방식으로 코드를 단축하여 질문에 넣으십시오). – whosrdaddy