Pergunta

Tenho uma tabela que contém todos os funcionários de uma empresa (hr_employees).Além desta tabela, há outra tabela que contém todas as datas de início e término, além do tipo de contrato que possuem (hr_employees_status).

Com os dados que obtenho, escrevo 1 ou 0 (1 base permanente, 0 outro) em uma planilha Excel, codificada por cores conforme determinado pelo tipo de contrato (1 = preto, 0 = azul, verde, cinza ou vermelho) , em cada mês (de maio de 2005 até o presente).Como determino o que deve ser colocado em qual célula está por meio de uma cláusula case, observando o status atual na tabela hr_employee_status.

Ele faz um loop bem e faz 99% do que deveria corretamente.O único problema é que, assim que um funcionário passa de um contrato temporário para um contrato permanente, às vezes ele não escreve o valor correto em uma célula.

Mudei um pouco o código para extrair apenas o mês e o ano do banco de dados (e definir o dia como 01), na esperança de que, como o mês e o ano são tudo o que é necessário para gravar em uma célula, ele escreveria o dados corretos na célula correta.Mas sem sucesso.

Não sei qual código postar, então aqui está o loop que determina o tipo de contrato e grava na planilha 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 são os resultados recebidos do banco de dados.$start_at é a data em que o funcionário iniciou um tipo de contrato (e, portanto, determina qual mês marcar).$count é a diferença entre a data de início e a data de término (quantidade de meses).

Gostaria de saber POR QUE não começa na data correta na troca do contrato temporário para o permanente.

Se alguma outra informação for necessária, por favor me avise.

EDITAR 1: - Resposta ao feedback de DaveRandom e Oleg

@DaveRandom:hr_employees se parece com isso:

------------------------------------------
|employee_id|name|surname|otherinfo|state|
|1          |Foo |Bar    | ******* |  1  |
|2          |Ben |Smith  | ******* |  1  |
------------------------------------------

hr_employees_status se parece com isso:

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

E então a planilha Excel irá gerar

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 é o seguinte:

    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. Veja acima. $dates é um loop pela tabela hr_employee_status.Tenho 100% de certeza de que o status está lá.

  3. Por favor, explique o malabarismo de tipo?Todos os valores em status são varchar (e não me pergunte por que, olhando agora, parece uma coisa estúpida de se fazer...)

Foi útil?

Solução

Estamos faltando uma parte crucial do seu código, então até que você forneça mais detalhes (você poderia nos mostrar onde você define $start_at por exemplo?) Só posso adivinhar...

  1. Você pergunta "por que não começa na data correta", mas nunca fornece o código onde $start_at é definido.Poderia ser útil para nós.
  2. Por que você é switching $dates['status']?Você tem certeza que está dentro $dates?
  3. O switch instrução compara valores após malabarismo de tipo ...

Exemplo de php.net:

switch ("a") {
case 0:
    echo "0";
    break;
case "a": // never reached because "a" is already matched with 0
    echo "a";
    break;
}

Este pode ser o seu caso quando o estatuto de contrato permanente 1 nunca é alcançado no seu switch statement por causa do tipo incorreto de $dates['status'] fazendo parar em case '0':.

Tente usar var_dump() para ver os tipos e valores exatos das variáveis ​​nas quais você está operando em seu código.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top