سؤال

لدي جدول يحتوي على جميع الموظفين في الشركة (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

@ أوليغ

  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
    
  2. أنظر فوق. $dates عبارة عن حلقة من خلال جدول hr_employee_status.أنا متأكد بنسبة 100% من أن الوضع موجود هناك.

  3. يرجى توضيح نوع شعوذة؟جميع القيم الموجودة في الحالة هي varchar (ولا تسألني عن السبب، فبالنظر إليها الآن، يبدو أنه من الغباء القيام بها...)

هل كانت مفيدة؟

المحلول

نحن نفتقد جزءًا مهمًا من التعليمات البرمجية الخاصة بك، لذلك حتى تقدم المزيد من التفاصيل (هل يمكنك أن توضح لنا المكان الذي تحدده $start_at على سبيل المثال؟) لا أستطيع إلا أن أخمن...

  1. أنت تسأل "لماذا لا يبدأ في التاريخ الصحيح" ولكنك لا تقدم الرمز مطلقًا $start_at ويعرف.يمكن أن يكون مفيدا لنا.
  2. لماذا انت switchعمل $dates['status']؟هل أنت متأكد من أنه في $dates?
  3. ال switch بيان يقارن القيم بعد نوع شعوذة ...

مثال من php.net:

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() لمعرفة الأنواع والقيم الدقيقة للمتغيرات التي تعمل عليها في التعليمات البرمجية الخاصة بك.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top