الدروس · الدرس 2 من 5
الطابور، والمفتاح الذي يتكرّر
كيف يولد المستند، وما الذي يضمنه المفتاح الخارجي، والقاعدتان في المخطِّط اللتان لا تستطيعان العمل اليوم.
الدرس 2 من 5 · 24 د
التسليم ليس رسالة، بل سجلّ
حين يخبر هذا التطبيق نظاماً آخر بشيء، فهو لا يرسل رسالة وينسى. بل يكتب صفاً. ويعطي ذلك الصفّ اسماً. ويحتفظ بالصفّ بعد ذلك.
والاسم هو التصميم كلّه. فالاسم محسوب من السجلّ لا مخترعاً، لذلك ينتج التسليم نفسه الاسم نفسه دائماً. وذلك ما يتيح لأحدهم أن يضغط الزرّ مرّتين بلا خوف. هذا الدرس عمّا يتركّب منه الاسم، وعمّا يحميه، وعن شيء واحد لا يحميه البتّة.
عند Vlad طلب شراء معتمد للقنّب على STY-352. وقد أكّدت Alina لتوّها ORD-1362. ولم يفعل أيّ منهما شيئاً بخصوص الدفتر، وقد كتب التطبيق صفّين سلفاً.
سبعة أنواع مستندات، والاثنان اللذان ستراهما
يعرّف التطبيق سبعة أنواع مستندات صادرة. تلك هي المفردات كاملةً. وأيّها ينطبق عليك ينتج عن السجلّات التي تنشئها مساحة عملك فعلاً — فالمصنع الذي لا يتعاقد من الباطن أبداً لا ينتج طلب خدمة أبداً.
| النوع | التسمية على الطابور | يُنتَج اليوم من |
|---|---|---|
| طلب شراء | طلب شراء | طلب شراء معتمد |
| أمر بيع | أمر بيع | طلبيّة ليست مسوّدة وليست مغلقة |
| بضاعة مستلمة | بضاعة مستلمة | لا شيء بعد |
| صرف مواد | صرف مواد | لا شيء بعد |
| إرسالية | إرسالية | لا شيء بعد |
| عمولة | عمولة | لا شيء بعد |
| طلب خدمة | طلب خدمة | لا شيء بعد |
والعمود الأخير هو الصادق. اثنان من السبعة يمكن إنتاجهما اليوم، والسبب دالّة واحدة تجمع ما هو قابل للتصدير. تقرأ طلبات الشراء المعتمدة، وتقرأ الطلبيّات. ولا تقرأ غير ذلك.
أمّا مستندات الأحداث المادّية — استلام، وصرف، وإرسال — فلها نوعها وتسميتها وموضعها في ترتيب الملفّات. ولا مصدر سجلّات خلفها. ولمستند العمولة قاعدة خاصّة كذلك. فلا يُخطَّط له إلا حين تكون مساحة العمل وكيل شراء وتحمل الطلبيّة نسبة عمولة، وإجراء التصدير يمرّر جواباً مثبَّتاً بالنفي.
لحظتا ولادة، واسم واحد
يُنشأ صفّ المستند في إحدى لحظتين. وذلك مهمّ، لأن اللحظتين تبدوان على الشاشة بلا صلة.
الأولى هي الحدث التجاري. فحين يُعتمد طلب شراء Vlad، يُدرج إجراء الاعتماد مستند طلب الشراء. وحين تؤكّد Alina الطلبيّة، يُدرج إجراء التأكيد أمر البيع. ولم يختر ذلك أيّ منهما.
وكلتا الكتابتين مغلّفة كي يُبتلع الإخفاق. يقول التعليق في الشيفرة إن الإدراج التلقائي يجب ألّا يكسر تدفّق الاعتماد أو التأكيد، وهو لا يكسره. وإخفاق الطابور في هذه اللحظة صامت عن قصد. ولا شيء على الطلبيّة يقول إن مستنداً لم يُكتب.
واللحظة الثانية هي التصدير. تضغط Corina تصدير إلى نظام المحاسبة، فيجمع التطبيق كلّ ما هو قابل للتصدير حالياً ويخطّط مستنداً لكل منه.
وهذان المساران يكرّران كل مستند في معظم الأنظمة. وهنا لا يستطيعان، لأن كليهما يحسب الاسم نفسه.
ويسمّى الاسم المفتاح الخارجي. وهو أربعة أجزاء تصلها النقطتان: نوع السجلّ، ومعرّف السجلّ، ونوع المستند، والمراجعة. فيصير طلب Vlad هو purchase_request:41:po_request:1.
والعمود الحامل له فريد، والإدراج مكتوب كي لا يفعل شيئاً عند التصادم لا كي يخفق. فالكتابة الثانية للمفتاح نفسه ليست خطأً ولا تكراراً. بل ليست شيئاً البتّة.
ماذا يفعل التصدير المكرّر حقاً
هنا ينبغي للقارئ المتأنّي أن يبطئ. فجملة «تستطيع التصدير مرّتين بأمان» صحيحة في شيء وباطلة في آخر.
الطابور محميّ. صدّر يوم الاثنين وصدّر ثانيةً يوم الثلاثاء، يبق أمر البيع لـ ORD-1362 صفاً واحداً، مكتوباً مرّة، بحالة واحدة.
والملفّ غير محميّ. فالتصدير يجمع السجلّات القابلة للتصدير حالياً في كل مرّة، ويكتب صفاً في التنزيل لكل واحد منها، سواء أُرسل ذلك المستند سلفاً أم لا. فملفّ Corina يوم الثلاثاء يحوي ORD-1362 ثانيةً. ولا شيء في التطبيق يزيل تكرار الملفّ، ولا شيء يعلّم صفاً بأنه أُرسل من قبل.
وليس ذلك عيباً، ومعرفة السبب هي غاية هذا القسم. فالتطبيق لا يستطيع أن يعرف ماذا فعل دفتر Mirela بملفّ الاثنين. فقد يكون استُورد، أو استُورد نصفه، أو تُرك في مجلّد التنزيلات. فيناول التطبيق المجموعة المستحقّة في كل مرّة، ويضع المفتاح الخارجي في العمود الأول من كل صفّ. وذلك العمود هو الشيء الوحيد الذي يستطيع الدفتر إزالة التكرار عليه. والحماية حقيقية، لكنها تقيم في الجهة الأخرى من التسليم، ولا تعمل إلا إن استعمل محمّل الملفّ ذلك العمود.
خمس حالات، وثلاث لا تبلغها شيفرة
يحمل الصفّ في الطابور حالة، ويعرّف التطبيق خمساً منها: معلّق، ومصدَّر، ومُقَرّ، ومربوط، وخطأ. والدورة التي تصفها حقيقية. يُدرَج المستند، ويُرسَل، ويُقَرّ من النظام المستقبل، ثم يُربط أخيراً بالرقم الذي أعطاه ذلك النظام.
ولا يُبلغ منها إلا الأوليان. يُنشأ الصفّ معلّقاً. ويعلّمه التصدير مصدَّراً. ولا شيء في التطبيق يكتب أبداً «مُقَرّ» أو «مربوط» أو «خطأ». ولا شيء يكتب أبداً الحقل الحامل للمرجع المعاد من النظام الآخر. والدالّة التي تفعل ذلك موجودة وتأخذ كل ما تحتاجه من وسائط، ومناديها الوحيد خارج مجموعة الاختبار هو التصدير، يضبطها على «مصدَّر».
وذلك مهمّ لسبب بعينه. فالدفتر يقابل فاتورة المورّد بأمر الشراء وبإيصال الاستلام قبل أن يدفع، وتسمّى تلك المقابلة المطابقة الثلاثية. ولإجرائها يحتاج الدفتر إلى استلامات التطبيق محفوظة تحت رقم أمر الشراء عنده هو — فعلى التطبيق أن يقرأ ذلك الرقم. والعمود له موجود. والدالّة التي تملؤه موجودة. والمسار الذي يناديها هو الوصلة الحيّة، والوصلة الحيّة غير موصولة.
القاعدتان في المخطِّط اللتان لا تستطيعان العمل
الدالّة التي تحوّل السجلّ إلى مستندات — ويسمّيها هذا الدرس المخطِّط — صغيرة وخالصة. وتحمل قاعدتين تأتيان من المجال مباشرةً. إحداهما تعمل. والأخرى لا تستطيع.
القاعدة العاملة هي الاتجاه. تحمل الطلبيّة منظوراً، والمخطِّط يقرؤه: طلبيّة الصانع تصير أمر بيع، وطلبيّة المشتري تصير طلب شراء. واليوم يمرّر كل نداء «صانع»، لأن عمود المنظور مصمَّم غير مبنيّ، ولأن التطبيق تطبيق مصنع. والقاعدة صحيحة ومدخلها ثابت.
والأخرى هي التي تستحقّ بقية هذا الدرس. المادة الحرّة قماش يورّده المشتري بلا مقابل، ويجب ألّا تنتج طلب شراء أبداً. فطلب الشراء في الدفتر يصير ذمّة دائنة. والذمّة الدائنة عن قماش لا يشتريه أحد التزام وهمي على أحدهم أن يفكّه آخر الأمر. والمخطِّط ينفّذ ذلك بالضبط. فإن قال السجلّ إن نموذج توريده مورَّد من المشتري، لم يُعِد مستندات البتّة.
وثلاث حقائق منفصلة تمنع تلك القاعدة من العمل.
- لا مُنادٍ يمرّر الحقل. مسار الاعتماد يدرج الطلب بدونه. ومسار التصدير يجمع الطلب بدونه. والحقل اختياري، فالنداءان صحيحان، والقيمة التي يقرؤها المخطِّط غائبة دائماً.
- الكلمة لا تطابق مفردات التطبيق. نماذج التوريد في التطبيق هي
ownedوnominatedوsupplied، وكل ما لا يعرفه يُقسر إلىowned. والمخطِّط يقارن بـbuyer_supplied، وهي قيمة لا ينتجها التطبيق أبداً. وتلك السلسلة ترد في ملفّين اثنين لا غير: المقارنة نفسها، والاختبار الذي يناول المقارنة حرفيّتها. - الحقيقة تقيم على السجلّ الخطأ. نموذج التوريد خاصّية سطر في قائمة مواد. ولطلب الشراء سطور أيضاً، تحمل مادّة وكمّية ووحدة ومورّداً مقترحاً — ولا نموذج توريد. فحتى المنادي الراغب في تمرير القيمة لا يجد موضعاً يقرؤها منه. والطلب المختلط السطور لا تصفه قيمة واحدة أصلاً.
ولا شيء من هذا خطر اليوم، ويستحقّ قول السبب قبل أن يفزع أحد. فالتصدير ملفّ ينزّله إنسان ويستورده إنسان. وMirela تقرأ ما تحمّله. والقاعدة تهمّ لحظة وصول الوصلة الحيّة، لأن المستند نفسه يعبر حينها بلا إنسان في الوسط.
اختبر فهمكتعدّل Alina طلبيّة ORD-1362 من 12,000 قطعة إلى 13,500 بعد تصديرها مرّة. تتبّع ما يستلمه الدفتر عند التصدير التالي، وسمِّ الحقل المصمَّم لهذه الحال.أظهر الإجابة
يجمع التصدير التالي الطلبيّة من جديد، فيحمل الصفّ في الملفّ 13,500. والمفتاح الخارجي لم يتغيّر، لأنه مبنيّ من نوع السجلّ ومعرّفه ونوع المستند والمراجعة — والكمّية ليست جزءاً منه. وكتابة الطابور بلا أثر، فالصفّ ما زال هو المكتوب أول مرّة، ما زال معلَّماً «مصدَّراً». فيستلم الدفتر الكمّية الجديدة تحت المفتاح القديم. وكون ذلك تحديثاً أو تكراراً قرار الدفتر وحده، والتطبيق لم يخبره أيّهما قُصد. والحقل المصمَّم لهذا هو المراجعة. وهو الجزء الرابع من المفتاح، وقيمته الافتراضية واحد، ولا شيء في التطبيق يمرّر غيرها — فالتعديل لا يستطيع اليوم أن يعلن نفسه مستنداً جديداً. والقراءة الصادقة أن للتطبيق آليةَ تسليمٍ مرقَّمة ولم يصلها بعد بالأحداث التي ترفع رقمها.
اختبر فهمكيسأل Vlad لماذا ينبغي إصلاح قاعدة المادة الحرّة الآن، وتصدير الملفّ يقرؤه إنسان. أعطِ أقوى حجّة على تركها وأقوى حجّة على إصلاحها.أظهر الإجابة
حجّة تركها أن قاعدة بلا مُنادٍ بلا سلوك، فلا شيء ينكسر. والإصلاح كذلك ليس تغييراً واحداً بل ثلاثة — حقل على سطر طلب الشراء، وقيمة تُمرَّر في موضعي النداء، ومفردات يتّفق عليها النصفان. وفعل ذلك على نحو رديء أسوأ من عدم فعله، لأن كبحاً نصف موصول يعمل على السطور الخطأ يوقف بصمت طلبات مشروعة عن بلوغ الدفتر. وحجّة إصلاحها أن الخطر يصل مع الوصلة الحيّة دفعةً لا تدريجاً، وأن الشيفرة تُقرأ اليوم كأن الحماية قائمة. فالقارئ المستقبلي يرى قاعدة مسمّاة واختباراً ناجحاً، ولا سبب عنده ليفحص هل تصل القيمة أصلاً. وتلك هي الحال الأخطر — لا حارس غائب، بل حارس غائب يبدو حاضراً.
موجّه · اقرأ لي طابور مستندات نظام المحاسبة
بعد أول تصهذهر، وفي أي وقت يقول فيه قسم المالية إن مستنداً وصل مرّتين أو لم يصل أبداً.
ساعدني في قراءة طابور المستندات الصادرة في MerchandiserOS ومعرفة ما استلمه نظامي المالي فعلاً. سألصق صفوف الطابور: نوع المستند، والسجلّ، والحالة. وسأخبرك أيضاً كم مرّة ضغطنا «تصهذهر إلى نظام المحاسبة» وهل استُورد كل ملفّ نُزّل. أولاً، اشرح ما يستطيع الطابور إخباري به وما لا يستطيع. حالة الصفّ هي ما فعله هذا التطبيق، لا ما فعله النظام الآخر. قل صراحةً أي الحالات يكتبها هذا التطبيق وأيّها لا يكتبها. وعامل أي حالة أدّعيها خارج ذلك بوصفها شيئاً يستحقّ السؤال. ثم اعمل على خطر التكرار. المفتاح الخارجي ثابت لكل سجلّ ونوع مستند، فإعادة التصهذهر لا تفعل شيئاً في الطابور وتفعل شيئاً في الملفّ. أخبرني أي صفوفي ستظهر مرّة أخرى في ملفّ تصهذهر ثانٍ، وماذا على نظامي المالي أن يفعل بذلك العمود كي لا ينشئ مستنداً ثانياً. وأخيراً، اذكر أي سجلّ عدّلته منذ تصهذهره أول مرّة، واشرح ماذا يستلم النظام الآخر عنه. لا تخبرني أبداً بأن مستنداً استُلم. هذا التطبيق لا يستطيع معرفة ذلك.
قد يخطئ الذكاء الاصطناعي — تحقّق من أي شيء ستتصرّف بناءً عليه.