3

会社のすべての従業員(hr_employees)を含むテーブルがあります。このテーブルに加えて、すべての開始日と終了日、およびそれらが持つ契約のタイプ(hr_employees_status)を含む別のテーブルがあります。

取得したデータを使用して、1または0(1パーマネントベース、0その他)をExcelスプレッドシートに書き込み、契約のタイプ(1 =黒、0 =青、緑、灰色、または赤)によって色分けします。 、毎月(2005年5月から現在まで)。hr_employee_statusテーブルの現在のステータスを見て、case句によってどのセルに何を入れるべきかをどのように決定するか。

正常にループし、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);
}

$dateDBから受け取った結果です。 $start_at従業員が契約タイプで開始した日付です(したがって、マークする月を決定します)。 $count開始日と終了日(月数)の差です。

一時的な契約から恒久的な契約に切り替えるときに、なぜそれが正しい日付で開始されないのか知りたいです。

その他の情報が必要な場合は、お知らせください。

編集1: -DaveRandomとOlegからのフィードバックへの応答

@DaveRandom: 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

@Oleg

  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. 上記を参照。$dateshr_employee_statusテーブルを介したループです。ステータスはそこにあると100%確信しています。

  3. 型変換について説明してください。statusのすべての値はvarcharです(そして、なぜ今それを見ると、それは愚かなことのように思えます...)

4

1 に答える 1

0

コードの重要な部分が欠落しているため、詳細を提供するまで($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;
}

これは、で停止するswitch statementタイプが正しくないために、永続的な契約ステータス1に到達しない場合です。$dates['status']case '0':

を使用var_dump()して、コードで操作している変数の正確なタイプと値を確認してください。

于 2012-05-21T08:27:50.837 に答える