Lista em colunas

Boa tarde a todos, estou com uma dificuldade e gostaria da ajuda de vocês:
image

No exemplo exemplifico o que desejo fazer, onde a lista de itens vai preenchendo a coluna até 3 linas e após a lista continua em ordem na coluna posterior e assim por diante. Tente usar o código abaixo mas sem sucesso.

$sql = “SELECT
nome_completo
FROM
pessoas;”;
sc_lookup(ds,$sql);
if(!empty({ds})){
$lista = {ds[0][0]};
}else{
$lista = ‘erro’;
}

/*
Inicia o contador geral que será usado para comparar a quantidade de registros retornados do banco de dados.
/
$c = 0;
/

Inicia o contador de colunas
/
$i = 1;
/

Quantidade de colunas por linha
*/
$l = 3;

/*
Quantidade de registros retornados do banco de dados
*/
$rows = mysqli_num_rows($lista);

/*
Itera a consulta ao banco de dados
/
while ( $linha = mysqli_fetch_assoc($lista) )
{
/

Se o valor do contador de colunas $i for igual a 1, indica que uma nova linha deve ser aberta.
Se uma nova linha está sendo aberta, quer dizer que uma linha anterior deve ser fechada. No entando, é preciso verificar se já passou pela primeira linha, pois antes da primeira linha não há o que ser fechado.
Para verificar isso, podemos aproveitar o contador geral $c
*/
if( $i <= 1 )
{
if( $c > 0 ){
echo ‘’;
} // Fecha uma linha
echo ‘’; // Abre uma linha
}

/*
Escreve a coluna com o valor obtido da consulta ao banco de dados
*/
echo PHP_EOL . '<td>' . $linha["nome"] . '</td>';

/*
Checagem para incrementar ou resetar o contador de colunas.
*/
if($i <= $l )
{
    /*
    Incrementa o valor de $i para indicar que será escrita a próxima linha 
    */
    $i++;
}else{
    /*
    Reseta para o valor 1, pois será formada nova linha caso não tenha chegado ao final indicado pela condição $c == $row
    */
    $i = 1;
}

/*
Incrementa o valor do contador geral.
Deve ser livre, sem condicionais.
*/
$c++;

/*
Verifica se encontrou o final da consulta.
Esse passo é muito importante para evitar que a última linha fique sem a tag de fechamento pois a quantidade de registros pode ser um número que não seja múltiplo do valor definido na variável $l
*/
if( $c == $row )
{
    echo '</tr>';
}

}

Desde já agradeço muito pela ajuda.

ja deu uma olhada nessa classe:

1 Curtida

Haroldo,
este DataGrids e’ incrivel !
eu estou tentando implementar na minha aplicacao, mas esta dando um erro que acho q possa ser de digitacao … Teria como vc passar o link para download, pra mim? (betopessanha@gmail.com).
Quando copiei o mesmo, esta dando uma msg de error.
Ex.
Use of undefined constant tagName - assumed ‘tagName’ (this will throw an Error in a future version of PHP)

Muito obrigado

https://iwh.tec.br/downloads/iwactions.zip

Depois que migraram o Blog passou a dar esses problemas.
No zip:
iwDataGrid - montar grids para formulários e report pdf
iwPdf - apoio para desenvolver PDF
rotinas-> loading para carga de página

Obrigado Sr. Haroldo pelo retorno, desde ja agradeço pela dica.
Vou tentar implementar e darei o retorno em breve.

Haroldo, muito obrigado… Deus continue abencoando vc!

Boa tarde sr. Haroldo, poderia me ajudar em usar o datagrid para fazer a formatação da minha tabela igual ao exemplo acima:
Estou usando uma gridformato livre e dentro dela uma sobconsulta onde desejo fazer a listagem acima.

qual o limite de colunas?
quantos registros processaria?

primeiro tem que ter o total de registros.
depois montar array com quebra até 3 linhas, quebrou 3 linhas adiciona um item ao array.

depois joga tudo no datagrid.

A consulta traz 12 registros e a ideia e colocar em 4 colunas com três 3 itens cada.
Gostaria de dividir os 12 itens nas três colunas.

Trabalhando nisso…

muito obrigado pela ajuda

Na Prática:
https://dev.iwh.tec.br/scriptcase/control_datagrid_horizontal/

Importar como aplicação: (ajustar para seu banco de dados)
https://dev.iwh.tec.br/downloads/sc9_forum_sc_datagrid_horizontal.zip

Biblioteca externa:
https://dev.iwh.tec.br/downloads/iwactions.zip

evento onScriptInit:

sc_include_library('prj','iwactions','datagrid/datagrid.class.php');

evento de botão ajax:

$sel = "select left(fn_razao,25) from fornecedores order by fn_razao limit {registros}";
$linhasArr = [];
$nColuna = 0;
$quebra = 0;
sc_select(rs,$sel);
if ({rs} === false)
{
	echo "Erro de acesso. Mensagem = " . {rs_erro};
}
	else
{
	while (!{rs}->EOF){
		if ($quebra > {linhas}-1) {
		  	$quebra = 0;
			$nColuna++;			
		}
		$linhasArr[$quebra][$nColuna] = {rs}->fields[0];		
		$quebra++;
		{rs}->MoveNext();
	}
	{rs}->Close();
}

$colunas = (float) ceil({registros} /  {linhas});

//echo '<pre>';
//print_r($linhasArr);
//echo '</pre>';

$dg = new DataGrid($colunas);

$dg->setStyle('Table','style','white-space: nowrap');

$labels=[];
for ($i=0;$i<$colunas;$i++) {
	$labels[$i] = 'Coluna '.($i+1);
}
$dg->addHeader($labels);

foreach($linhasArr as $celulas) {
	$dg->addCell($celulas);
}

{dg} = $dg->create();

criar campos linhas (spin), registros (select) e dg (label)

Nota: Para deixar o exemplo mais completo criei a possibilidade de recriar a grid baseado em um número de linhas e de registros informados em tempo de execução.

TAGS: HAROLDO, DATAGRID, CONTROLE, HORIZONTAL, DINÂMICO

Bom dia a todos, Sr Haroldo ficou top das galáxias.
Muito obrigado pela ajuda, que para mim foi tutorial.
Agradeço também pelo tempo que vc dedicou para está ajuda.

1 Curtida

Pode parecer besteira, mas programar não é só style= background-color: pink.
Para programar tem que se desenvolver muito a lógica. Algumas pessoas conseguem desenvolver uma lógica totalmente na mente e colocar em prática, mas dependendo se faz necessário trabalhar na mesa, ou seja, realizar o teste de mesa. Isso não se ensina mais nos cursos e faculdades hoje em dia: Fluxograma:

Eis o Fluxograma de exemplo acima:
https://app.lucidchart.com/invitations/accept/f55111ba-8dea-47e8-a1ab-4da741358e79

Obrigado mais uma vez por sua generosidade.

1 Curtida

Outro Exemplo do poder da Classe DataGrid

O código da a capacidade da tabela crescer horizontalmente de forma dinâmica, ou seja em tempo de execução.

https://dev.iwh.tec.br/scriptcase/blank_datagrid_horizontal/

sc_include_library('prj','iwactions','class/DataGrid.class.php');
sc_include_library('prj','iwactions','loading.php');

$meses = ['JANEIRO','FEVEREIRO','MARCO','ABRIL','MAIO','JUNHO','JULHO','AGOSTO','SETEMBRO','OUTUBRO','NOVEMBRO','DEZEMBRO'];
$corCols =['#ABEBC6','#F9E79F','#AED6F1'];
$dados = json_decode('{"1":{"2021-1":{"1":7232,"2":3400,"3":"3832"},"2021-2":{"1":7232,"2":3400,"3":"11264"},"2021-3":{"1":7000,"2":3400,"3":"7432"}},"2":{"2021-1":{"1":333,"2":3400,"3":"-3067"},"2021-2":{"1":15255,"2":3400,"3":"6388"},"2021-3":{"1":1000,"2":3400,"3":"-5467"}},"3":{"2021-1":{"1":17024,"2":4000,"3":"13024"},"2021-2":{"1":17024,"2":4000,"3":"22548"},"2021-3":{"1":500,"2":4000,"3":"9524"}}}',true);

$dados2 = json_decode('{"1":["ROLAMENTO DDU C3 6400","0"],"2":["FITA ISOLANTE","0"],"3":["TOMADA 2+T","0"]}',true);

//pegando o indice da primeira linha
//$key=array_key_first($dados); // :( só funciona no php 7.3
$key= '';
$header1=[];
$header2=['Produto','Estoque Inicial'];
foreach ($dados as $key => $val) {
	//montando array da linha 1 e 2 do cabeçalho
	foreach ($val as $anoMes => $val2) {
		$arr = explode('-',$anoMes);
		$header1[] = $meses[$arr[1]-1].'/'.$arr[0];
		$header2[] = 'Compra';
		$header2[] = 'Venda';
		$header2[] = 'Estoque Final';
	}
	break;
}

$cols = count($dados[$key])*3;

$dg = new DataGrid($cols+2);

$dg->setStyle('Table','style','font-family:Arial,Helvetica,sans-serif');

$dg->setStyle('Header_Cell', 'colspan', '2');
$dg->setStyle('Header', 'style', 'background-color:#F7DCA3');
$dg->setStyle('Header', 'style', 'color:black');
$dg->addHeader(' ');

$dg->setStyle('Header', 'style', 'background-color:#D5DBDB');
$dg->setStyle('Header', 'style', 'color:black');
for ($i=1;$i<=$cols/3;$i++){
	$dg->setStyle('Header_Cell', 'colspan', '3');
	$dg->addHeader($header1[$i-1]);
}

//atribuindo  estilos as celulas
$ii=0;
for ($i=1;$i<=$cols+1;$i++) { //varrendo as colunas iniciando na 2 coluna até n colunas
	$dg->setStyle("Header_Cell", 'style', 'width:60px', $i); //largura das colunas de valores
	$dg->setStyle("Cell", 'style', 'text-align:center', $i);
	$dg->setStyle('Cell', 'style', "background-color:{$corCols[$ii]}",$i); //aplicando as cores as colunas
	$ii=$ii==2?0:$ii+1;		
}

$dg->addHeader($header2);

//$dg->setZebraColor('LIGHTGRAY'); //INFORMANDO UMA COR AS LINHAS ZEBRADAS
foreach ($dados as $key => $val) { //varre as linhas
	$dados2[$key][0]=$key.' - '.$dados2[$key][0]; //concatenando id com descriç!ao do produto 
	$linha2 =[];

	foreach ($val as $val2){	//varre as celulas de cada linha	
		$linha2= array_merge($linha2,$val2);		
	}
	
	$dg->addCell(array_merge($dados2[$key],$linha2)); //gera toda a linha
}

echo $dg->create();
1 Curtida

Muito show Sr. Haroldo, mais um exemplo de presente a comunidade do SC

1 Curtida

Haroldo, estou usando o dataGrid, muito obrigado !
Uma pergunta, tem como eu alterar as bordas do table do datagrid? estou tentando, mas sem sucesso.

Você pode aplicar qualquer estilo na tabela.

Veja em:

$dg->setStyle(“Row”, ‘style’, ‘color: blue’); // aplica estilo na linha
$dg->setStyle(“Cell”, ‘style’, ‘text-align:center’, ‘0’); // aplica estilo na primeira coluna
$dg->setStyle(“Table”, ‘style’, ‘text-align:center’); // aplica estilo em toda a tabela
$dg->setStyle(“Header”, ‘style’, ‘text-align:center’); //aplica estilo na linha do cabeçalho
$dg->setStyle(“Table”, ‘class’, ‘highllight’); // adicionando um atributo class a tabela

Ola, Haroldo.
Como vc faria para quebra de pagina, usando o datagrid ?