2012-05-21 5 views
3

회사의 모든 직원 (hr_employees)을 포함하는 테이블이 있습니다. 이 테이블 외에도 시작 날짜와 종료 날짜가 모두있는 다른 테이블과 계약 유형 (hr_employees_status)이 있습니다.루프가 올바른 값을 쓰지 않음

내가 얻은 데이터를 사용하여 계약 유형 (1 = 검정색, 0 = 파란색, 녹색, 흰색)에 따라 색상이 지정된 엑셀 스프레드 시트에 1 또는 0 (1 영구 기반, 0 기타) 회색 또는 빨간색), 매월 (2005 년 5 월부터 현재까지). 어떤 셀에 들어가야하는지 결정하는 방법은 case 절을 ​​사용하는 것이며, hr_employee_status 테이블의 현재 상태를 살펴 보는 것입니다.

루프가 잘 돌아가고 올바르게 수행해야하는 작업의 99 %를 처리합니다. 유일한 문제는 직원이 임시 계약에서 영구적 인 계약으로 이전하자마자 셀에 올바른 값을 쓰지 않는 경우가 종종 있습니다.

코드를 데이터베이스에서 단지 1 년에 한 번만 가져 와서 (01을 01로 설정) 코드를 변경하여 월 및 연도가 모두 셀에 쓰기 위해 필요하기 때문에, 올바른 셀에 올바른 데이터를 쓸 것입니다. 그러나 아무 소용이 없습니다.

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 올렉의 의견에 응답

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

그리고 엑셀 시트가 출력됩니다

다음과 같이
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. 위를 참조하십시오. $dates은 hr_employee_status 테이블을 통한 루프입니다. 나는 그 상태가 100 % 확신합니다.

  3. 유형 저글링에 대해 설명해주세요. status에있는 모든 값은 varchar입니다. (왜 그런지 묻지 않습니다. 지금 보니 어리석은 짓처럼 보입니다 ...)

+0

DB의 예제 데이터와 현재/원하는 스프레드 시트 출력을 표시 할 수 있습니까? – DaveRandom

+0

* "때로는 올바른 값을 셀에 쓰지 않습니다."* 대신 무엇을 쓰나요? 또한 로그의 모든 오류/경고? – Oleg

+0

유형 저글링은 기본적으로 자동 변수 유형 변환입니다. 예를 들어 String을 Integer와 비교할 때 String은 자동으로 Integer로 변환됩니다. 따라서 PHP에서 :'var_dump (0 == "a"); // true'. – Oleg

답변

0

당신이 더 많은 정보를 제공 할 때까지 예를 들어 $start_at을 정의하는 경우 (당신이 우리를 보여줄 수 있도록 우리는 코드의 일부 중요한 부분을 누락?) 난 단지 추측 할 수 ...

  1. "올바른 날짜에 시작하지 않는 이유는 무엇입니까?"라고 묻지 만 $start_at이 정의 된 코드는 제공하지 않습니다. 우리에게 유용 할 수 있습니다.
  2. switch$dates['status']입니까? $dates에 있습니까?
  3. switch 문 ... 타입 저글링 후 값을 비교

Example from 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에 도달하지 않습니다 귀하의 경우 수 있습니다 $dates['status']의 경우 case '0':에 있습니다.

var_dump()을 사용하여 코드에서 작동하는 변수의 정확한 유형과 값을 확인하십시오.