문제

회사의 모든 직원(hr_employees)이 포함된 테이블이 있습니다.이 테이블 외에도 모든 시작 날짜와 종료 날짜 및 계약 유형(hr_employees_status)이 포함된 또 다른 테이블이 있습니다.

내가 얻은 데이터를 사용하여 Excel 스프레드시트에 1 또는 0(영구 기반 1개, 기타 0개)을 씁니다. 계약 유형에 따라 색상이 구분됩니다(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);
}

$date DB에서 받은 결과입니다.$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   |
------------------------------------------

그러면 엑셀 시트가 출력됩니다.

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. 너는 왜 switching $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