Como generar desde un boton las consultas SQL ya creadas para poblar las tablas automaticamente

Buenos dias comunidad Framework yii.

Estoy trabajando en unas tablas de framework yii 2 y quiero poblar unas tablas por medio de dos botones.

Me gustaría saber si es posible crear dos botones que me hagan el siguiente trabajo:

tengo ya creadas las consultas en SQL de los datos que tengo que subir a las tablas, entonces lo que quiero hacer es crear un botón que me genere automáticamente ya los datos creados y que me pueda poblar automáticamente las tablas que necesito llenar.

Que presione el botón y automáticamente me llene las tablas con los datos que ya tengo en la base de datos.

Agradecería su gran ayuda.

Saludos.

Hola Jose, mira yo resulvo eso de la siguiente forma, en el controlador hago una funcion donde pongo las query, y hago una vista para llamar la funcion mediante un boton, te pongo este ejemplo:

En el controlador, debes poner la funcion en las rules del controlador




   public function actionHacerCierreanual() {

    	// $model = $this->loadModel($id);

    	$almacen = $_POST['entidad'];

    	{

        	$query = "

		CREATE TABLE IF NOT EXISTS cierreanual (

        	id INT NOT NULL AUTO_INCREMENT,

        	fecha date,

        	PRIMARY KEY (id) )

        	ENGINE = InnoDB";

        	Yii::app()->db->createCommand($query)->execute();


        	$query = "DELETE detallesfacturasinre

    	FROM 

	detallesfacturasinre";

        	Yii::app()->db->createCommand($query)->execute();


        	$query = "DELETE datosfacturainre

    	FROM 

	datosfacturainre";

        	Yii::app()->db->createCommand($query)->execute();


        	$query = "DELETE detallesfacturas

    	FROM 

	detallesfacturas";

        	Yii::app()->db->createCommand($query)->execute(); //UPDATE productos SET lg=2 WHERE Codde=1


        	$query = "DELETE datosfacturas

    	FROM 

	datosfacturas";

        	Yii::app()->db->createCommand($query)->execute(); //UPDATE productos SET lg=2 WHERE Codde=1


        	$query = "DELETE detallesrecepcion

    	FROM 

	detallesrecepcion";

        	Yii::app()->db->createCommand($query)->execute();


        	$query = "DELETE datosrecepcion

    	FROM 

	datosrecepcion";

        	Yii::app()->db->createCommand($query)->execute(); //


        	$query = "DELETE detallestransferencias

    	FROM 

	detallestransferencias";

        	Yii::app()->db->createCommand($query)->execute();


        	$query = "DELETE datostransferencia

    	FROM 

	datostransferencia";

        	Yii::app()->db->createCommand($query)->execute();


        	$query = "DELETE detallesvinterno

    	FROM 

	detallesvinterno";

        	Yii::app()->db->createCommand($query)->execute();


        	$query = "DELETE datosvinterno

    	FROM 

	datosvinterno";

        	Yii::app()->db->createCommand($query)->execute();


        	$query = "DELETE detallesvtrab

    	FROM 

	detallesvtrab";

        	Yii::app()->db->createCommand($query)->execute(); //


        	$query = "DELETE datosvtrab

    	FROM 

	datosvtrab";

        	Yii::app()->db->createCommand($query)->execute(); //


        	$query = "DELETE invdetallemov

    	FROM 

	invdetallemov";

        	Yii::app()->db->createCommand($query)->execute();


        	$query = "DELETE invdocumentomov

    	FROM 

	invdocumentomov";

        	Yii::app()->db->createCommand($query)->execute();

    	}

    	//  $dataReader = Yii::app()->db->createCommand($query)->queryAll();

    	// Yii::app()->end();

    	Yii::app()->user->setFlash('success', 'Cierre realizado satisfactoriamente');

    	$model = new Cierreanual; // para colocar la fecha en la BD

    	$model->fecha = date('Y-m-d');

    	$model->save();

    	$this->redirect(isset($_POST['returnUrl']) ? $_POST['returnUrl'] : array('admin'));

    	//  $this->render('cierreanual');	

	}



esta es la vista




<div class="form">


	<?php echo CHtml::form($this->createUrl('importar'), 'post', array('enctype' => 'multipart/form-data')); ?>


	<div style="text-align:center">

    	<h1>Cierre de Informaci&oacute;n</h1>

	</div>


	<table>

    	<div>

        	<b>Se hace el Cierre de informaciones</b>       	 

    	</div>

    	<tr>

        	<td width="63"><?php

            	echo CHtml::label('Entidad', 'entidad');

            	echo CHtml::dropDownList('entidad', 'CodUEB', CHtml::listData(Entidades::model()->findAll(), 'CodUEB', 'NEnt'));

            	?></td>    

    	</tr>

    	<tr>

        	<td style="width:45%; text-align:center">    

            	<fieldset>


                	<legend><h4>Hacer Cierre</h4></legend>                           	 


                	<br/>

                	<div>

                    	<?php echo CHtml::submitButton('Cerrar', array('submit' => array('cierreanual/hacerCierreanual'))); ?>

                	</div> 


            	</fieldset>

        	</td>

        	<td/>

    	</tr>


	</table> 	 


	<?php echo CHtml::endForm(); ?>


</div>



Como observaras, yo tengo las querys en un solo boton y son para eliminar datos de tablas, pero igula funciona con consultas de insertar datos en las tablas y separa por botones las tablas, o sea, has un boton para cada tabla.

Espewro que resuelvas

Hola rafaelrosales muchas gracias por responder y por tu gran ayuda.

Mi pregunta es la siguiente el primer código lo ingreso en controller --> sitecontroller ?

y el código de la vista creo en views?

es que tengo esas dudas agradecería tu ayuda.

saludos.

Hola jose, primero debes tener claro como vas a manejar la informacion, me dices que quieres poblar dos tablas, ¿como vas a manejar la informacion?, si es por el modelo de cada tabla o por un modelo llamar las dos tablas, en cada caso el controlador es el del modelo donde vas a manejar la informacion, al igual que la vista.

hola rafaelrosales pues tengo una base de datos con 14 tablas, por medio de unas consultas que ya hice en SQL ya tengo los respectivos datos para llenar las tablas, pero lo que yo quiero es por medio de un botón llenar automáticamente las tablas, osea que al presionar el botón la información se suba a las respectivas tablas de la base de datos y ya teniendo la información en las tablas de la base de datos ya debe aparecer en las tablas de mi aplicación de framework yii2.

En pocas palabras los botones se tienen que conectar con las consultas de SQL.

la idea es tener dos botones un botón para la información del SAC de la universidad y el otro botón para la información del campus vityual.

Si tienes alguna idea te agradecería tu gran ayuda.

Gracias y saludos.

Las consultas Sql que tienes me imagino que provienen de tablas de tu base de datos (entre las 14), entonces las tablas que vas a llenar con las consultas, ¿Son ta,bien de esa BD?

Te sugiero lo siguiente:

creas el modelo vista controlador de las dos tablas, o sea, el modelo, el controlador y las vistas

En el controlador de cada tabla creas una funcion para contener las consultas y operaciones:

En las rules del controlador




public function accessRules() {

    	return array(

        	array('allow', // allow all users to perform 'index' and 'view' actions

            	'actions' => array('index', 'view'),

            	'users' => array('*'),

        	),

        	array('allow', // allow authenticated user to perform 'create' and 'update' actions

            	'actions' => array('create',  'llenartabla1', update'),

            	'users' => array('@'),

        	),

        	array('allow', // allow admin user to perform 'admin' and 'delete' actions

            	'actions' => array('admin', 'delete'),

            	'users' => array('admin'),

        	),

        	array('deny', // deny all users

            	'users' => array('*'),

        	),

    	);

	}



función:




public function actionllenartabla1() {

    	// $model = $this->loadModel($id);

    	$almacen = $_POST['entidad'];

    	{

//aqui pones tu query para llenar esta tabla:

            	$query = "

            	Select tabla1.campo1, tabla1.campo2, tabla1campo3, ...

				from tabla1

				where ...

				order by ...";

            	Yii::app()->db->createCommand($query)->execute();          	

            	

    	}

 		Yii::app()->user->setFlash('success', 'Cierre realizado satisfactoriamente');

      	$this->redirect(isset($_POST['returnUrl']) ? $_POST['returnUrl'] : array('admin'));

    	//  $this->render('tabla1');   	

    	}



	Haz un vista para ejecutar la query:



		<div class="form">


 		<div style="text-align:center">

    	<h1>Llenar tabla 1</h1>

    	</div>


    	<table>

    	<div>

            	<b>Se llena la tabla 1</b>            	

    	</div>

   		<tr>

            	<td style="width:45%; text-align:center">	

            	<fieldset>


                    	<legend><h4>Llenar tabla</h4></legend>                           		


                    	<br/>

                    	<div>

                    	<?php echo CHtml::submitButton('Cerrar', array('submit' => array('tabla1/llenartabla1'))); ?>

                    	</div> 


            	</fieldset>

            	</td>

            	<td/>

    	</tr>


    	</table> 		


    	<?php echo CHtml::endForm(); ?>


</div>



este es un ejemplo mas o menos como puedes manejar la informacion

Hola rafaelrosales soy muy novato aun en yii2, estoy recién aprendiendo :blink: y no se en que parte agregar el codigo que me facilitaste pues mis directorios de mi aplicación son asi:

assets/

commands/

config/

views/

controllers/

mail/

models/

runtime/

test/

vendor/

web/

index.php

yii

Entonces me gustaria saber en que directorios agregar el codigo que me dices.

Gracias y estoy atento a tu respuesta.

Buenas.

Y no sería más fácil tener un arquivo sql con las consultas a ejecutar y hacer lo siguiente?:




$sql = file_get_contents('ruta_archivo.sql');

Yii::app()->db->createCommand($sql)->execute();



Un saludo.

Hola lagogz gracias por tu ayuda, mi pregunta seria en donde colocaria esas lineas de codigo que me muestras, es que hasta hora estoy empezando a programar en yii2.

Espero tu pronta respuesta.

Saludos!!!

Buenas.

Deberías colocarlo en la acción que lance el botón que utilices para ejecutar las consultas.

Un saludo.

Hola lagogz gracias por tu ayuda, por ejemplo yo tengo varios script como haria para generarlos.

Buenas, Jorge.

Puedes hacerlo por ejemplo con un bucle. Imagínate que tienes un directorio llamado "scritps". Pues mediante un bucle puedes recoger todos los archivos del directorio y hacerles un "execute".

Pero bueno, hai más formas. Utiliza la que más se adapte a lo que buscas.

Es que no sé lo que deseas.

Supongo que lo lógico sería tener una vista desde la que puedas seleccionar cada archivo y ejecutarlo.

Un saludo.

hola lagogz

En pocas palabras los botones se tienen que conectar con las consultas de SQL.

por ejemplo tengo esta consulta de SQL:

SELECT u.username, u.lastname, u.firstname ,q.fullname

FROM mdl_course AS q

INNER JOIN mdl_context AS ctx ON ctx.instanceid = q.id

INNER JOIN mdl_role_assignments AS ra ON ctx.id = ra.contextid

INNER JOIN mdl_role AS r ON r.id = ra.roleid

INNER JOIN mdl_user AS u ON u.id = ra.userid

WHERE r.id = 3

ORDER BY u.lastname, u.firstname

entonces esta consulta es una de las que me arroja los datos que necesito para poblar una de las tablas de mi aplicación yii2 y lo que quiero es crear un botón que su función sea que al presionarlo me arroje los datos de la consulta en un archivo CSV para después manualmente subir el archivo a la tabla de la aplicación.

Agradeceria tu gran ayuda

Saludos!

No. Los botones se "conectan" con acciones, que a su vez ejecutan consultas SQL. Tendrías que tener un botón que lanzase una acción que te generase un archivo csv.

Por ejemplo un botón que apunte a una acción como:




public function actionExport()

        {

            header("Cache-Control: must-revalidate, post-check=0, pre-check=0");

            header('Content-Description: File Transfer');

            header("Content-type: text/csv; charset=utf-8");

            header("Content-Disposition: attachment; filename=myFilename.csv");

            header("Expires: 0");

            header("Pragma: public");


            $rows = Yii::app()->db->createCommand($myQuery)->queryAll();


            $output = fopen('php://output', 'w');									

            fputcsv($output, $myColumnHeaders, ';');			

		

            foreach($rows as $row)						

            {


                    fputcsv($output, str_replace("\r\n", " ", $row), ';');

            }


            fclose($output);

        }



Un saludo.

hola lagogz muchas gracias por tu ayuda excelente aporte.

Amigo me gustaria saber donde podria en codigo del boton es que la verdad soy un poco novato en este tema y hasta hora estoy aprendiendo

digamos donde dice myFilename pondria el nombre del archivo?

agradeceria tu gran ayuda.

saludos!!!

Estimado para esas cosas vas a config/database y configuras tu base de datos…

lo otro tienes que activar mysql hay mismo si no quieres usar sqllite y comentar la linea de sql lite…

despues te vas a config/main todo esto en la carpeta protected…

y descomentas gii:

'modules'=&gt;array(


	// uncomment the following to enable the Gii tool


	'gii'=&gt;array(


		'class'=&gt;'system.gii.GiiModule',


		'password'=&gt;'admin',                          &lt;-------------------- cambiale la password ya que aparecera una muy larga... :3


		// If removed, Gii defaults to localhost only. Edit carefully to taste.


		'ipFilters'=&gt;array('127.0.0.1','::1'),


	),


),

una vez descomentado vas en tu navegador y colocas:

localhost:8000/index.php?r=gii o localhost/proyecto/[size=2]index.php?r=gii[/size]

[size=2]

[/size]

[size=2]una vez hay comienza la magia…[/size]

[size=2]

[/size]

[size=2]si quieres crear paginas estaticas son base de datos usa controller generator (no base de datos)[/size]

[size=2]si quieres usar base de datos usa model y crud generator (metodo base de datos)[/size]

[size=2]en crud generator pones el mismo nombre que le pusiste a tu model[/size]

[size=2]

[/size]

[size=2]esto te creara todo automaticamente, las paginas, despues en el main/layout de tu view configra tus accesos…[/size]

[size=2]

[/size]

[size=2]

[/size]

[size=2]Es facil hay harta y basta documentacion de esto…[/size]

[size=2]

[/size]

[size=2]antes de preguntar busca…[/size]

[size=2]

[/size]

[size=2]saludos…[/size]

Lo pondrías en una vista, y sí, tendrás que sustituir "myFilename" por el nombre que desees que tenga el archivo resultante.

Un saludo.

vale lagogz gracias por tu ayuda.

saludos!