我有一个包含公司所有员工的表(hr_employees)。除了此表之外,还有另一个表,其中包含他们的所有开始日期和结束日期,以及他们拥有的合同类型 (hr_employees_status)。

根据我获得的数据,我将 1 或 0(1 基于永久,0 其他)写入 Excel 电子表格,颜色编码由合同类型决定(1 = 黑色,0 = 蓝色、绿色、灰色或红色) ,每个月(从 2005 年 5 月至今)。如何通过 case 子句确定哪个单元格中应包含哪些内容,并查看 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. 请解释一下类型杂耍?status 中的所有值都是 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