حلقة لا تكتب القيم الصحيحة
-
12-12-2019 - |
سؤال
لدي جدول يحتوي على جميع الموظفين في الشركة (hr_employees).بالإضافة إلى هذا الجدول، يوجد جدول آخر يحتوي على جميع تواريخ البدء والانتهاء الخاصة بهم، بالإضافة إلى نوع العقد لديهم (hr_employees_status).
باستخدام البيانات التي أحصل عليها، أكتب 1 أو 0 (1 قائم على أساس دائم، 0 آخر) في جدول بيانات Excel، مرمزًا بالألوان وفقًا لنوع العقد (1 = أسود، 0 = أزرق، أخضر، رمادي أو أحمر) ، في كل شهر (من مايو 2005 حتى الوقت الحاضر).كيف يمكنني تحديد ما يجب أن يحدث في أي خلية من خلال جملة الحالة، بالنظر إلى الحالة الحالية في جدول hr_employee_status.
إنه يتكرر بشكل جيد، ويفعل 99% مما ينبغي عليه بشكل صحيح.المشكلة الوحيدة هي أنه بمجرد انتقال الموظف من عقد مؤقت إلى أساس دائم، فإنه في بعض الأحيان لا يكتب القيمة الصحيحة للخلية.
لقد قمت بتغيير الكود قليلاً لسحب الشهر والسنة فقط من قاعدة البيانات (وضبط اليوم على 01)، على أمل أنه بما أن الشهر والسنة هما كل ما هو مطلوب للكتابة في الخلية، فستكتب البيانات الصحيحة في الخلية الصحيحة.ولكن دون جدوى.
لا أعرف ما هو الكود الذي يجب نشره، لذا فهذه هي الحلقة التي تحدد نوع العقد وتكتبه في ورقة Excel:
switch ($dates['status']) {
case '0':
$color = 'blue';
$cellcontent="0";
break;
case '1':
$color = 23;
$cellcontent="0";
break;
case '2':
$color = 'black';
$cellcontent="1";
break;
case '3':
$color = 'green';
$cellcontent="0";
break;
case '4':
$color = 'red';
if(mysql_num_rows($query) > 2)
$cellcontent = "0";
else {
$cellcontent="1";
}
break;
}
if($s['state'] == '4')
$color = 'red';
$format_content =& $workbook->addFormat(array('align' => 'center', 'size' => 11, 'numformat' => '@', 'fontfamily' => 'Calibri', 'left' => 1, 'bottom' => 1, 'right' => 1, 'color' => $color));
for($f = $start_at; $f <= $start_at+$count; $f++) {
$totalmonths = $totalmonths + $cellcontent;
$worksheet->write($k,15+$f,$cellcontent,$format_content);
}
$date
هي النتائج كما وردت من قاعدة البيانات.$start_at
هو التاريخ الذي بدأ فيه الموظف نوع العقد (وبالتالي يحدد الشهر الذي يجب تحديده).$count
هو الفرق بين تاريخ البدء وتاريخ الانتهاء (مقدار الأشهر).
أود أن أعرف لماذا لا يبدأ في التاريخ الصحيح عند التحول من عقد مؤقت إلى عقد دائم.
إذا كانت هناك أي معلومات أخرى مطلوبة، واسمحوا لي أن أعرف.
تحرير 1: - الرد على ردود الفعل من DaveRandom وOleg
@ديفراندوم:hr_employees
يشبه هذا:
------------------------------------------
|employee_id|name|surname|otherinfo|state|
|1 |Foo |Bar | ******* | 1 |
|2 |Ben |Smith | ******* | 1 |
------------------------------------------
hr_employees_status
يشبه هذا:
------------------------------------------
|employee_id|from_date |to_date |status|
|1 |2006-07-12|2009-08-11| 0 |
|1 |2009-08-12|0000-00-00| 1 |
|2 |2009-07-01|0000-00-00| 1 |
------------------------------------------
وبعد ذلك سيتم إخراج ورقة Excel
Name Surname Start Date *dates* June-06 July06 ->- July09 Aug09 Sep09
Foo Bar 2006-07-12 *empty* 0 ->- 0 1 1
Ben Smith 2009-07-01 *empty* *empty* ->- 1 1 1
@ أوليغ
$start_at
على النحو التالي:round(((substr($dates['from_date'],0,4) * 12) + substr($dates['from_date'],5,2)) - ((substr($start_date,0,4) * 12) + substr($start_date,5,2))) + 1; // $dates is a loop through the hr_employee_status table
أنظر فوق.
$dates
عبارة عن حلقة من خلال جدول hr_employee_status.أنا متأكد بنسبة 100% من أن الوضع موجود هناك.يرجى توضيح نوع شعوذة؟جميع القيم الموجودة في الحالة هي varchar (ولا تسألني عن السبب، فبالنظر إليها الآن، يبدو أنه من الغباء القيام بها...)
المحلول
نحن نفتقد جزءًا مهمًا من التعليمات البرمجية الخاصة بك، لذلك حتى تقدم المزيد من التفاصيل (هل يمكنك أن توضح لنا المكان الذي تحدده $start_at
على سبيل المثال؟) لا أستطيع إلا أن أخمن...
- أنت تسأل "لماذا لا يبدأ في التاريخ الصحيح" ولكنك لا تقدم الرمز مطلقًا
$start_at
ويعرف.يمكن أن يكون مفيدا لنا. - لماذا انت
switch
عمل$dates['status']
؟هل أنت متأكد من أنه في$dates
? - ال
switch
بيان يقارن القيم بعد نوع شعوذة ...
switch ("a") {
case 0:
echo "0";
break;
case "a": // never reached because "a" is already matched with 0
echo "a";
break;
}
قد تكون هذه هي حالتك حيث لم يتم الوصول مطلقًا إلى حالة العقد الدائم 1 في حسابك switch statement
بسبب نوع غير صحيح من $dates['status']
مما يجعلها تتوقف عند case '0':
.
جرب استخدام var_dump()
لمعرفة الأنواع والقيم الدقيقة للمتغيرات التي تعمل عليها في التعليمات البرمجية الخاصة بك.