2011-06-06 19 views
5

डेल्फी एक्सई, विन 32 एप्लिकेशन, एसक्यूएल सर्वर 2005 डेटाबेस का उपयोग कर Win32 एप्लिकेशन के लिए डायनामिक प्रोसेस मैप कार्यान्वित करना।डेल्फी

मैं एक गुणवत्ता प्रबंधन प्रणाली लागू कर रहा हूं। मेरे पास कुछ पूर्वनिर्धारित प्रक्रिया मानचित्र हैं जो उन्हें मेरे एप्लिकेशन/सिस्टम के अंदर लागू करने के लिए हैं। मुझे अनुरोध है कि सभी लेनदेन (मुझे यकीन नहीं है कि यह सही शब्द है) गतिशील है, इसलिए जब भी वे प्रक्रिया मानचित्र संशोधित करते हैं तो यह एप्लिकेशन को प्रभावित करता है (बिना किसी संकलन या पाठ्यक्रम के किसी भी पैच)

यहां एक उदाहरण है और अधिक स्पष्ट व्याख्या करने के लिए:

एक दस्तावेज़ को नियंत्रित मॉड्यूल मान लें, हम एक प्रक्रिया नक्शे के रूप में है:

  1. [दस्तावेज़ नियंत्रक] ठेकेदार
  2. से दस्तावेज़ प्राप्त
  3. [दस्तावेज़ नियंत्रक] दस्तावेज़ सूची के साथ चेक
  4. [दस्तावेज़ नियंत्रक] [परियोजना प्रबंधक]
  5. [परियोजना प्रबंधक] करने के लिए दस्तावेज़ भेजता लागू होता है और दस्तावेज़ में कार्रवाई
  6. [परियोजना प्रबंधक] करने के लिए दस्तावेज़ भेजता [दस्तावेज़ नियंत्रक]
  7. [दस्तावेज़ नियंत्रक] दस्तावेज़ अभिलेखागार।

अब एप्लिकेशन को अपने कार्यों के लिए डेटाबेस से पैरामीटर पढ़ना चाहिए। मान लें कि दस्तावेज़ प्राप्त हुआ और चेक किया गया (1 और 2) और अब इसे भेजता है। जैसे ही "सेव" बटन दबाया जाता है, सिस्टम को यह जांचना चाहिए कि इस दस्तावेज़ का रिसीवर कौन होना चाहिए और उसे दस्तावेज़ भेजना चाहिए। हमारे उदाहरण में, रिसीवर [प्रोजेक्ट मैनेजर] है। हालांकि, कुछ समय बाद वे प्रक्रिया मानचित्र को के रूप में बदलने का निर्णय ले सकते हैं - "3- [दस्तावेज़ नियंत्रक] दस्तावेज़ [परियोजना वास्तुकार] को भेजता है"। इसलिए, सिस्टम को प्रक्रिया मानचित्र में परिभाषित के रूप में कार्य करना चाहिए।

मुझे आश्चर्य है कि इस तरह के सिस्टम को लागू करने का सही तरीका क्या है (डेल्फी एक्सई, win32)?

मेरे पास कुछ विचार है लेकिन यह सुनिश्चित नहीं है कि यह उचित है: प्रक्रिया मानचित्र में प्रत्येक प्रक्रिया के लिए मैं एक अद्वितीय आईडी के साथ एक सेवा को परिभाषित कर सकता हूं और मैंने डेटाबेस से सेवा पढ़ी है और इसे एप्लिकेशन परत में कॉल किया है (प्रासंगिक पैरामीटर्स के साथ)। इस मामले में मुझे यकीन नहीं है कि प्रत्येक सेवा एक डीएलएल या पैकेज फ़ाइल होनी चाहिए और मेरा मानना ​​है कि लाइब्रेरी फाइलों की संख्या होना गलत है, क्योंकि सेवाएं बहुत कम नहीं जा रही हैं!

मुझे उम्मीद है कि मैं अपनी समस्या को अच्छी तरह से समझा सकता हूं और माफ कर सकता हूं अगर यह बहुत लंबा है। अगर यह स्पष्ट नहीं है तो कृपया मुझे बताएं।

धन्यवाद,
Mahya

+2

मुझे लगता है कि यह कोडिंग के बजाए एक आर्किटेक्चर प्रश्न है और इसलिए स्टैक ओवरफ़्लो के लिए उपयुक्त नहीं है। –

+1

शायद संबंधित या सहायक: _ "क्या डेल्फी के लिए" वर्कफ़्लो इंजन "कार्यान्वयन है?" _ (Http://stackoverflow.com/questions/3492725/is-there-a-workflow-engine-implementation-for-delphi) – mjn

उत्तर

2

यह मेरे लिए लगता है कि आप हर "व्यापार समारोह", आपके आवेदन द्वारा किया जाता है, जिससे गुणवत्ता प्रबंधन के कुछ फार्म को लागू करने के लिए कुछ सामान्य नियम लागू करना चाहते हैं। मैं एक लॉजिकल ऑपरेशन को इंगित करने के लिए "व्यापार फ़ंक्शन" का उपयोग करने जा रहा हूं जो स्रोत कोड में कई तकनीकी फ़ंक्शंस और प्रक्रियाओं का विस्तार कर सकता है।

कोई परिभाषित "उचित तरीका" नहीं है, लेकिन कुछ विचार दूसरों की तुलना में बेहतर हैं।

डायनामिक डेटा स्टोर करने के लिए डेटाबेस का उपयोग स्पष्ट रूप से एक अच्छा विचार है।उदाहरण के लिए आप प्रत्येक व्यावसायिक फ़ंक्शन को एक अलग इकाई के रूप में मॉडल कर सकते हैं (प्रति व्यवसाय फ़ंक्शन के लिए एक डेटाबेस रिकॉर्ड के साथ)। प्रत्येक व्यावसायिक फ़ंक्शन की प्रसंस्करण को प्रबंधित करने के लिए आपको जो भी चर की आवश्यकता होगी, आवश्यक फ़ील्ड निर्धारित करेंगे। आपको निश्चित रूप से प्रत्येक के लिए एक अद्वितीय आईडी की आवश्यकता होगी।

व्यवसाय कार्यों को अलग-अलग डीएलएस में कोड करने का कोई कारण नहीं है, लेकिन मैं उन्हें स्रोत कोड में अलग इकाइयों में डाल दूंगा या शायद उनके प्रकार के ऑपरेशन या कुछ अन्य लॉजिकल ग्रुपिंग के अनुसार कार्यों को समूहित कर सकता हूं जो आपके लिए समझ में आता है व्यापार। आपको अपने व्यवसाय कार्यों को कॉल करने के तरीके को बदलने की आवश्यकता होगी। आपको उन्हें अप्रत्यक्ष रूप से कॉल करने की आवश्यकता होगी, दूसरे शब्दों में आप एक जेनेरिक परफॉर्मेशन रूटीन को कॉल करेंगे, शायद फ़ंक्शन आइडेंटिफ़ायर और कुछ अन्य पैरामीटर को पास करने के लिए जो भी डेटा स्ट्रक्चर आपको उपयुक्त बनाता है। चूंकि डेटाबेस में पैरामीटर बदल दिए जाते हैं (आपके उदाहरण के अनुसार, दस्तावेज़ प्रबंधक, प्रोजेक्ट मैनेजर या प्रोजेक्ट आर्किटेक्ट को कौन भेजना है?) व्यवसाय फ़ंक्शन का संचालन तब तक संशोधित किया जाएगा जब तक आप सभी संभावित क्रमिक कार्यान्वित नहीं कर लेते प्रत्येक व्यवसाय समारोह के लिए चर की संख्या दी जा सकती है। मुझे यकीन है कि दस्तावेज़ प्राप्तकर्ता का ईमेल पता आपके मन में नहीं है। यहां कुछ कोड है जो मदद कर सकता है। मैं यह नहीं कह रहा कि यह अच्छा कोड है, यह केवल विचार व्यक्त करना है।

type 
    TFunctionRuntimeParameter = record 
    FunctionID: integer; // this better be unique 
    FunctionName: string; // something intelligible for display purposes 
    ReportToEmail: string; // who to send the end report document 
    AuditLevel: integer; // for example vary the degree of auditing/logging 
    variableABC: TDateTime; // could be a date that influences something 
    end; 

function TMyForm.GetRuntimeParametersFromDB(aFunctionID: integer): TFunctionRuntimeParameters; 
var 
    tempResult: TFunctionRuntimeParameters; 
begin 
    // For brevity I'm going to assume an existing query object connected to your db. 
    qry.SQL.Add('Select * From BusinessFunctions Where Function_ID = :FunctionID'); 
    qry.ParamByName('FunctionID').AsInteger := aFunctionID; 
    qry.Open; 
    tempResult.FunctionID := qry.FieldByName('Function_ID').AsInteger; // don't ask me Y! 
    tempResult.FunctionName := qry.FieldByName('Function_Name').AsString; 
    tempResult.ReportToEmail := qry.FieldByName('Report_To_Email').AsString; 
    tempResult.AuditLevel := qry.FieldByName('Audit_Level').AsInteger; 
    tempResult.variableABC := qry.FieldByName('ABC').AsDateTime; 
    result := tempResult; 
    qry.Close; 
end; 

procedure TMyForm.PerformFunction(aFunctionID: integer; FRP: TFunctionRuntimeParameters); 
var 
    MyReportDocument: TMyReportDocument; 
begin 
    if (FRP.AuditLevel > 0) then 
    // do something special before starting the function 

    case aFunctionID of 
    101: MyReportDocument := DoBusinessFunctionABC; 
    102: MyReportDocument := DoBusinessFunctionDEF; 
    103: MyReportDocument := DoBusinessFunctionXYZ; 
    end; 

    SendReportDocumentByEmailTo(MyReportDocument, FRP.ReportToEmail); 

    if ((Now - FRP.variableABC) > 28) then 
    // perhaps do something special every 4 weeks! 

    if (FRP.AuditLevel > 0) then 
    // do something special after the function has finished 
end; 

procedure TMyForm.btnBusinessFunctionXYZClick(Sender: TObject); 
var 
    FunctionID: integer; 
    FunctionRuntimeParameters: TFunctionRuntimeParameters; // record that mimics db entry 
begin 
    FunctionID := 1234; // or you might prefer an enum 
    FunctionRuntimeParameters := GetFunctionRuntimeParametersFromDB(FunctionID); 
    PerformFunction(FunctionID, FunctionRuntimeParameters); 
end; 

डेटाबेस में रनटाइम पैरामीटर परिवर्तन के रूप में इस तरह, आवेदन रखता की आवश्यकता के बिना अलग ढंग से व्यवहार करेंगे।