Вы находитесь на странице: 1из 184

Cmo utilizar la barra de progreso con SQL Query

Visual Studio Lenguajes foros , foros. NET Framework > Visual Basic Pregunta

0
Inicia una sesin para votar

Hola, tengo que mostrar una barra de progreso que muestra el progreso de comando sql est ejecutando: He probado el temporizador:

Si ProgressBar1.Value = 100 Entonces


Timer1.Stop ()

Ms
ProgressBar1.Value = Val (ProgressBar1.Value) + Val (1)

Fin Si
Timer1.Stop () , pero esto slo se detiene despus de la ejecucin, por lo que no es lo que necesito. me puede apuntar en la direccin correcta a nadie, gracias

Lunes, 14 de septiembre 2009 09:26 AM Responder | Cita | deti 80 Puntos

Respuestas

1
Inicia una sesin para votar

Echa un vistazo similares Reddy

Marcado como respuesta Jeff Shan Lunes, 21 de septiembre 2009 02:14 AM

Lunes, 14 de septiembre 2009 14:38 Responder | Cita | Kolan Veera Reddy Redeemsoft 2525 Puntos

1
Inicia una sesin para votar

Yo no creo que esto se puede lograr utilizando ExecuteNonQuery. A continuacin se muestra un enlace que muestra cmo utilizar el delegado SqlInfoMessageEventHandler para proporcionar informacin de progreso.http://geekswithblogs.net/mrnat/archive/2004/09/20/11431.aspx

Paul ~ ~ ~ ~ Microsoft MVP (Visual Basic)


o
Marcado como respuesta Jeff Shan Lunes, 21 de septiembre 2009 02:14 AM

Lunes, 14 de septiembre 2009 18:16 Responder | Cita | Paul P Clemente IV (MCC, MVP) 62.330 Puntos

Todas las respuestas

1
Inicia una sesin para votar

Hola, uso BackgroundWorker echar un vistazo a este enlace. espero que te ayudar.http://msdn.microsoft.com/en-us/library/system.componentmodel.backgroundworker.aspx

Saludos cordiales, C.Gnanadurai ----------------------- favor, marque la entrada como respuesta si es servicial a usted
o
Propuesto como respuesta Gnanadurai Lunes, 14 de septiembre 2009 14:42

Lunes, 14 de septiembre 2009 10:36 AM Responder | Cita | Gnanadurai (Socio) 6480 Puntos

0
Inicia una sesin para votar

Gracias por la respuesta que sola BackgroundWorker y funciona cuando asign valor fijo del sub que he creado, Con esta Sub est trabajando:

Dim intI, INTC As Integer Dim intI2, intC2 As Integer Dim strTemp As String = "" DblProgrs dvil como doble INTC = 100 intC2 = 1,000 Para intI = 0 Para INTC - 1 Para intI2 = 0 Para intC2 - 1 strTemp = strTemp & "%" Prximo dblProgrs = (INTI + 1) * 100 / (INTC)

BackgroundWorker1.ReportProgress (dblProgrs) Prximo End Sub Tengo que usarlo con esto: Intentar

Dim As New SqlConnection CNN3 (My.Settings.sqlCn) Dim Cmd3 Como SqlCommand = cnn3.CreateCommand cmd3.CommandType = CommandType.StoredProcedure cmd3.CommandText = "Insertar" cnn3.Open () cmd3.ExecuteNonQuery ()

cnn3.Close () Catch ex As Exception MessageBox.Show (ex.Message.ToString) End Try

gracias
Lunes, 14 de septiembre 2009 14:16 Responder | Cita | deti 80 Puntos

1
Inicia una sesin para votar

Echa un vistazo similares Reddy

Marcado como respuesta Jeff Shan Lunes, 21 de septiembre 2009 02:14 AM

Lunes, 14 de septiembre 2009 14:38 Responder | Cita | Kolan Veera Reddy Redeemsoft 2525 Puntos

1
Inicia una sesin para votar

Yo no creo que esto se puede lograr utilizando ExecuteNonQuery. A continuacin se muestra un enlace que muestra cmo utilizar el delegado SqlInfoMessageEventHandler para proporcionar informacin de progreso.http://geekswithblogs.net/mrnat/archive/2004/09/20/11431.aspx

Paul ~ ~ ~ ~ Microsoft MVP (Visual Basic)


o
Marcado como respuesta Jeff Shan Lunes, 21 de septiembre 2009 02:14 AM

Lunes, 14 de septiembre 2009 18:16

c# backgroundworker progress problem!


Windows Forms forums > Windows Forms General Question

0
Sign in to vote Hi Guyz! I am new to threading and background workers. I do understand various methods and properties offered by the background worker. However i am stuck at one point (this could be solved theortically by just pointing in the right direction i suppose). My problem is that everywhere i see example of the background worker progress reporting in a loop (for, while, etc). Which is fine as any logic in a loop will report the progress.

However, lets say my application spreads accross a network or even on a single machine i have to run an SQL query (could be any, update, select deletc or whtever) and it takes like 20 seconds to run. How am i supposed to show THAT progress to the user? naturally there wont be a loop structure, then how will the progress increase? Is that even possible using background worker? If not, is there any other way to represent this progress? Note that this isnt just an SQL query, it could be any method that takes time. If this isnt clear, let me be more specific! Lets say i have a class MathClass and it has a method called Add. Lets say for the sake of argument this Add function takes 20 seconds to complete. I simply call this function using the object.Add(int, int) way in the DoWork event of the background worker. How in the world am i supposed to check for progress. Obviously there will not be ANY LOOP! i am simply frustrated because nearly 99.9% of the examples floating around the net /books /forums revolve around a loop. Please let me know where i am going wrong in my logic!

Many thanks Zeeshan


Monday, November 12, 2007 12:42 PM Reply | Quote | xeshu (Partner) 0 Points

Answers

0
Sign in to vote You can use ProgressBar to report progress of a BackgroundWorker. Bellow is a quick sample how to do it - you can start the backgroundworker by clicking a button and report progress of your background task.

private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e) { int rr = DoSome(); e.Result = rr;

} int DoSome() { int r = 0; for (int i = 0; i < 5; i++) { r = i; System.Threading.Thread.Sleep(1000); backgroundWorker1.ReportProgress((i + 1) * 10); } return r; } private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e) { progressBar1.Value = e.ProgressPercentage; } private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) { Text = "completed"; } private void button1_Click(object sender, EventArgs e) { backgroundWorker1.RunWorkerAsync(); }
Tuesday, November 13, 2007 4:40 AM Reply | Quote | Theodor Ilie 60 Points

All replies

Sign in to vote If you can't measure the progress then using a regular progress bar isn't the best UI option. Maybe you should use some kind of animation (like when your web browser is loading a page) or some other UI to indicate that the application is working.
Monday, November 12, 2007 1:12 PM Reply | Quote | Mattias Sjgren (Partner) 24,080 Points

0
Sign in to vote if you are using .NET 2.0 then there is a ProgressBar.Style property that you can set to ProgressBarStyle.Marquee. You start the animation when calling the function and ends when function returns. That way atleast user have some idea that something is happening. If you are using any earlier version then perhaps make one for yourself. I havent done it nor do I have much information about it, but you can try making a gif image and show it in a PictuerBox styled as a ProgressBar, that way you can make your own marquee style progress bar. Another thing that you can do is estimate the progress. That may not be applicable everytime. For example the first example you have given where you query SQL database, you may know the timeout. Lets say its 20 seconds, so you know the function will reatun in 20 seconds. you can devide the progress in 20 pieces. If the function return before 20 seconds, you can finish the progress.
Monday, November 12, 2007 2:14 PM Reply | Quote | ata-ul-malik 0 Points

Sign in to vote If you need to show that a operation is in progress, but you do not know how long the operation will take, this is what the ProgressStyle.Marquee was specifically designed for. Show the ProgressBar when the operation starts, and hide the ProgressBar when the operation ends.

Monday, November 12, 2007 2:16 PM Reply | Quote | v 1 1,760 Points

0
Sign in to vote You can use ProgressBar to report progress of a BackgroundWorker. Bellow is a quick sample how to do it - you can start the backgroundworker by clicking a button and report progress of your background task.

private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e) { int rr = DoSome(); e.Result = rr; } int DoSome() { int r = 0; for (int i = 0; i < 5; i++) { r = i; System.Threading.Thread.Sleep(1000); backgroundWorker1.ReportProgress((i + 1) * 10); } return r; }

private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e) { progressBar1.Value = e.ProgressPercentage; } private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) { Text = "completed"; } private void button1_Click(object sender, EventArgs e) { backgroundWorker1.RunWorkerAsync(); }
Tuesday, November 13, 2007 4:40 AM Reply | Quote | Theodor Ilie 60 Points

1
Sign in to vote None of you actually answered the origin poster's question.

A Marquee is not progress, it's just animation with no real indication of how far along a task is.

SQL and/or .NET (sqlclient) does not provide ANY means to report back on the status of a specific query -- this has been a fundamental problem from way way way back which Microsoft still have not addressed. Why, because it's difficult, but I would view this as a challenge, but apparently Microsoft view it as "too difficult to implement". This many years into the game of software development and

we still have no means to ask a .NET Fill to report back and statistics on progress and how many iterations the SQL query will require.

Instead, people are forced to do XYZ (sorta emphasised with the latest Mojave ads) cause Microsoft knows best ... how about Microsoft do XYZ so we can get on with giving our end users some indication that something is actually happening. A Marquee doesn't hack it.

Now BackgroundWorker, you're above example works, but any profession developer would not be using the DoWork method to house ALL the code for the task that is being processed. No, a good developer would be using another class/object to do the processing. And this class would have no means to report progress and be thread safe. So even with leaving it up to the developer to write a bunch of code to come up with a proposed progress (min/max), it's still impossible to be done within accepted OOP standards and within the confines of .NET.

If our users don't see some type of visual progress (A to B aka min to max) then a Marque does nothing for them and they either reboot, terminate the process, or hit the power button -- in all cases they think the computer has "locked up". A Marque is a lame attempt, but there again, I would expect nothing less from Microsoft, except the well LESS. As one knows, reboots, power buttons cause more problems than they solve on an end user's computer -- and often a support nightmare.

Here's a concept for Microsoft, how about providing some real methods to progress feedback from long running SQL queries? And a background worker that is a member of System.Core rather than System.ComponentModel so we don't have to corrupt our OOP class structures.

Would this be too much to ask, after developer for 25 yrs under Microsoft's OSs, it seems like a small request.

Rob.

c # problema progreso BackgroundWorker!


Windows Forms foros > Windows Forms General Pregunta

0
Inicia una sesin para votar Hola Guyz! Soy nuevo en roscado y trabajo en segundo plano. Entiendo varios mtodos y propiedades que ofrece el trabajo en segundo plano. Sin embargo yo estoy atrapado en un punto (esto podra ser resuelto theortically solamente apuntando en la direccin correcta, supongo). Mi problema es que en todas partes veo a ejemplo del progreso trabajo en segundo plano la presentacin de informes en un bucle (for, while, etc). Lo que est bien como cualquier lgica en un bucle reportar el progreso.Sin embargo, digamos que mi aplicacin se extiende al otro lado de una red o incluso en una sola mquina que tengo que ejecutar una consulta SQL (podra ser cualquier actualizacin, seleccione deletc o whtever) y que toma como 20 segundos para correr. Cmo se supone que voy a mostrar que el progreso para el usuario? naturalmente que no habr una estructura de bucle, entonces cmo va a aumentar el progreso? Es eso posible mediante trabajo en segundo plano? Si no es as, hay alguna otra manera de representar este progreso? Tenga en cuenta que esto no es slo una consulta SQL, podra ser cualquier mtodo que lleva su tiempo. Si esto no est claro, djame ser ms especfico! Digamos que tengo un MathClass clase y tiene un mtodo llamado Add. Digamos que por el bien del argumento de esta funcin Add tarda 20 segundos en completarse. Yo lo llamo simplemente esta funcin utilizando el object.Add (int, int) forma en el evento DoWork del trabajo en segundo plano. Cmo en el mundo se supone que debo comprobar el progreso. Obviamente no habr NINGN LAZO! Simplemente estoy frustrado debido a que casi el 99,9% de los ejemplos flotando por Internet / libros / foros giran alrededor de un bucle. Por favor, hgamelo saber a dnde voy mal en mi lgica! Muchas gracias Zeeshan

Lunes, 12 de noviembre 2007 24:42 Responder |

Cita | xeshu (Socio) 0 Puntos

Respuestas

0
Inicia una sesin para votar Usted puede utilizar ProgressBar para reportar el progreso de un BackgroundWorker. Bellow es una muestra rpida de cmo hacerlo - se puede iniciar el BackgroundWorker haciendo clic en un botn y reportar el progreso de la tarea en segundo plano.

void backgroundWorker1_DoWork privado (object sender, DoWorkEventArgs e) { int rr = DoSome (); e.Result = rr; } int DoSome () { int r = 0; for (int i = 0; i <5; i + +) { r = i; System.Threading.Thread.Sleep (1000), backgroundWorker1.ReportProgress ((i + 1) * 10); } r retorno; } private void backgroundWorker1_ProgressChanged (object sender, ProgressChangedEventArgs e) { progressBar1.Value = e.ProgressPercentage; } private void backgroundWorker1_RunWorkerCompleted (object sender, RunWorkerCompletedEventArgs e) { Text = "completado";

} private void Button1_Click (object sender, EventArgs e) { backgroundWorker1.RunWorkerAsync (); }


Martes, 13 de noviembre 2007 04:40 AM Responder | Cita | Theodor Ilie 60 Puntos

Todas las respuestas

0
Inicia una sesin para votar Si no se puede medir el progreso a continuacin, utilizando una barra de progreso regular no es la mejor opcin de la interfaz de usuario. Tal vez deberas utilizar algn tipo de animacin (como cuando su navegador se est cargando una pgina) o alguna otra interfaz de usuario para indicar que la aplicacin est funcionando.
Lunes, 12 de noviembre 2007 13:12 Responder | Cita | Mattias Sjgren (Socio) 24.080 Puntos

0
Inicia una sesin para votar si usted est utilizando. NET 2.0 a continuacin, hay una propiedad ProgressBar.Style que se puede establecer a ProgressBarStyle.Marquee. Usted comienza la animacin cuando se llama a la funcin y termina cuando devuelve la funcin. De esta manera al menos el usuario tiene alguna idea de que algo est pasando. Si est utilizando una versin anterior despus quizs hacer uno para usted mismo. No he

hecho que ni tengo mucha informacin sobre ella, pero puedes intentar hacer una imagen gif y mostrarla en un PictuerBox estilo como un ProgressBar, de esa manera usted puede hacer su propia barra de progreso estilo de la carpa. Otra cosa que usted puede hacer es estimar el progreso. Eso no puede ser cada vez aplicable. Por ejemplo, el primer ejemplo que ha dado donde se consulta la base de datos SQL, se puede conocer el tiempo de espera. Le dicen sus 20 segundos, as que usted sabe la funcin reatun en 20 segundos. se puede dividir la el progreso en 20 piezas. Si la funcin de volver antes de los 20 segundos, puede terminar el curso.

Lunes, 12 de noviembre 2007 14:14 Responder | Cita | ata-ul-malik 0 Puntos

0
Inicia una sesin para votar Si usted necesita para mostrar que una operacin est en curso, pero no se sabe cunto tiempo durar la operacin, esto es lo que el ProgressStyle.Marquee fue diseado especficamente para. Mostrar ProgressBar cuando se inicia la operacin, y ocultar el ProgressBar cuando finalice la operacin.

Lunes, 12 de noviembre 2007 14:16 Responder | Cita | DAVE 1 1760 Puntos

0
Inicia una sesin para votar

Usted puede utilizar ProgressBar para reportar el progreso de un BackgroundWorker. Bellow es una muestra rpida de cmo hacerlo - se puede iniciar el BackgroundWorker haciendo clic en un botn y reportar el progreso de la tarea en segundo plano.

void backgroundWorker1_DoWork privado (object sender, DoWorkEventArgs e) { int rr = DoSome (); e.Result = rr; } int DoSome () { int r = 0; for (int i = 0; i <5; i + +) { r = i; System.Threading.Thread.Sleep (1000), backgroundWorker1.ReportProgress ((i + 1) * 10); } r retorno; } private void backgroundWorker1_ProgressChanged (object sender, ProgressChangedEventArgs e) { progressBar1.Value = e.ProgressPercentage; } private void backgroundWorker1_RunWorkerCompleted (object sender, RunWorkerCompletedEventArgs e) { Text = "completado"; } private void Button1_Click (object sender, EventArgs e) { backgroundWorker1.RunWorkerAsync (); }
Martes, 13 de noviembre 2007 04:40 AM Responder | Cita |

Theodor Ilie 60 Puntos

1
Inicia una sesin para votar Ninguno de ustedes realmente respondi a la pregunta del cartel origen.

Una marquesina no es progreso, es slo la animacin sin indicacin real de cmo progresa una tarea es.

. SQL y / o NET (SqlClient) no proporciona ningn medio para informar sobre el estado de una consulta especfica - este ha sido un problema fundamental de la manera manera de nuevo que todava no se han ocupado de Microsoft. Por qu, porque es difcil, pero me gustara ver esto como un reto, pero al parecer Microsoft visualizarla como "demasiado difcil de implementar". Este muchos aos en el juego de desarrollo de software y todava no tenemos los medios para pedir a. NET Fill que informe y las estadsticas sobre el progreso y el nmero de iteraciones de la consulta SQL requerir.

En cambio, las personas se ven obligadas a hacer XYZ (sorta enfatizado con los ltimos anuncios de Mojave) causa Microsoft sabe mejor ... qu hay de Microsoft hacer XYZ para que podamos seguir adelante con dar a nuestros usuarios finales una indicacin de que algo est sucediendo realmente. Una marquesina no hackear.

Ahora BackgroundWorker, eres el ejemplo anterior funciona, pero cualquier desarrollador profesin no estara utilizando el mtodo DoWork para albergar a todo el cdigo para la tarea que se est procesando. No, un buen desarrollador estara utilizando otra clase / objeto para hacer el procesamiento. Y esta clase tendra ninguna manera de notificar el progreso y la ejecucin de subprocesos. As que incluso con dejar en manos de los desarrolladores para escribir un montn de cdigo para llegar a un progreso propuesto (min / max), todava es imposible de ser realizado dentro de los estndares aceptados de POO y dentro de los lmites de. NET.

Si nuestros usuarios no ven algn tipo de progreso visual (de A a B tambin conocido como mnimo al mximo), entonces una marca no hace nada para ellos y que puede reiniciar el sistema, terminar el proceso, o golpear el botn de encendido - en todos los casos que piensan que el equipo se ha "bloqueado". A Marque es un pobre intento, pero de nuevo, yo esperara nada menos de Microsoft, excepto el pozo MENOS. Como se sabe, reinicios, botones de encendido causan ms problemas de los que resuelven en la computadora de un usuario final - y, a menudo una pesadilla apoyo.

He aqu un concepto para Microsoft, qu hay de proporcionar algunos mtodos reales para progresar retroalimentacin de larga duracin consultas SQL? Y un trabajo en segundo plano que es miembro de System.Core lugar de System.ComponentModel as que no tienes que corruptos nuestras estructuras de clase POO.

Esto sera demasiado pedir, despus de desarrollador de 25 aos en virtud de los sistemas operativos Microsoft, parece una pequea peticin.

Rob.

Nat LuengnaruemitchaiGeek Blog


<< Funny Flash About Politics | Home | A Guy Worth Hiring >>

Report progress from SQL Server


Comments (12) | Share

Sometimes, your application might be very database centric. You might need to summarize/retrieve data from a big database. Therefore, the query might take a long time to execute such that user cannot bare to see a hang screen for several seconds or minutes without seeing any progress. To solve this problem, you might either create something like animated GIF i.e. hourglass icons or bouncing progress bar like FireFox installer or actually tell the user on the progress of query. It's pretty simple to do that with ADO.NET/SQL Server. You can simply hook up an event to SqlInfoMessageEventHandler like this.....
{ SqlConnection sqlConnection = new SqlConnection(................); sqlConnection.Open(); sqlConnection.InfoMessage += new SqlInfoMessageEventHandler(ProgressStatu s); ..... // Execute your long running operation } private void ProgressStatus(object sender, SqlInfoMessageEventArgs e) { if (e.Errors.Count>0) { string message = e.Errors[0].Message; int state = e.Errors[0].State;

// Set status of the progress bar } }

and in your sql statement/stored procedure if you have multiple statements to execute, you might choose to report the status among those statements i.e.
SELECT ............ FROM .......... INNER JOIN ............. INNER JOIN ............ RAISERROR('Message',10,25) WITH NOWAIT SELECT ............ FROM .......... INNER JOIN ............. INNER JOIN ............ RAISERROR('Message',10,50) WITH NOWAIT SELECT ............ FROM .......... INNER JOIN ............. INNER JOIN ............ RAISERROR('Message',10,75) WITH NOWAIT SELECT ............ FROM .......... INNER JOIN ............. INNER JOIN ............ RAISERROR('Message',10,100) WITH NOWAIT

NOWAIT option will force the message to be delivered to the client immediately instead of waiting until everything is done. To use this option properly, you need to make sure that RPC is the way of communication... in which it should be default. So whenever your stored procedure finishes running the first statement, RAISERROR will be called and causing ProgressStatus to be called and then you can update the status. Make sure that you run DataAdapter.Fill orSqlCommand.ExecuteReader in a separate thread which is not UI thread. Otherwise the progress bar may not be updated properly. If you are lazy, you can use Application.DoEvents to give some time to repaint the progress bar.
Posted on Monday, September 20, 2004 11:43 PM | Back to top

Comments on this post: Report progress from SQL Server


# re: Report progress from SQL Server

Please Help! I've tried this what you wrote there, and in my case the application is retrieving info at the end (the progress bar is updated at end of the stored procedure...) What did I do wrong? Could you give me a full example where this works? Thanks Frederic Left by Frederic Zawadzki on Oct 25, 2004 10:28 AM

# re: Report progress from SQL Server

1. Make sure that you use "WITH NOWAIT" statement after RAISERROR. 2. If you do so and it still doesn't work. Check your connection string. I have no clue but I would guess that TCP/IP connection is the best bet (specify "Network Library=DBMSSOCN;" in the connection string). It may not work if you connect using RPC. 3. Also make sure that you don't use ExecuteNonQuery() since ExecuteNonQuery may collect info and fire the event only when everything is done. Left by Nat on Oct 25, 2004 11:07 PM

# re: Report progress from SQL Server

Unfortunately! None o those solution.... here is my code: On the form1 I have a button which is calling a Class: private void btnOK_Click(object sender, System.EventArgs e) { string Conn = "Network Library=DBMSSOCN;Password=" + textBox3.Text + ";Persist Security Info=True;User ID=" + textBox2.Text + ";Initial Catalog=PanEuropean;Data Source=" +

textBox1.Text; UpdateData UD = new UpdateData(); UD.Load(Conn);

here is my class: using System; using System.Data.SqlClient; using System.Data; using System.Windows.Forms; namespace PanEuropean { /// <summary> /// Summary description for UpdateData. /// </summary> public class UpdateData {

public UpdateData() { // // TODO: Add constructor logic here // } public void Load(string e) { SqlConnection connection = new SqlConnection (e); try { connection.Open(); connection.InfoMessage += new SqlInfoMessageEventHandler(ProgressStatus); } catch (Exception) {

MessageBox.Show ("The connection was not possible! Please verify your connection parameters!"); Application.Exit(); }

SqlCommand command = new SqlCommand(); SqlTransaction transaction = connection.BeginTransaction(); command.Transaction=transaction; command.Connection=connection; try { command.CommandText="updateData"; command.CommandType=CommandType.StoredProcedure; command.CommandTimeout=0; command.ExecuteReader(); Application.DoEvents(); transaction.Commit(); connection.Close(); MessageBox.Show ("The Update is complete");

} catch (Exception ex) { MessageBox.Show("Exception thrown when updating DB: ", ex.Message); transaction.Rollback(); } } private void ProgressStatus(object sender,SqlInfoMessageEventArgs e) { if (e.Errors.Count>0) { string message = e.Errors[0].Message; int state = e.Errors[0].State; Form1 F1 = new Form1(); F1.label4.Text=message;

F1.progressBar1.PerformStep(); F1.progressBar1.Refresh(); } } } }

Please could you have a look? Thanks Frederic Left by Frederic Zawadzki on Oct 26, 2004 8:32 AM

# re: Report progress from SQL Server

Hmm... that might be because of the other issue. 1. ProgressStatus can be called from a thread which is not UI Thread 2. command.ExecuteReader(); will block UI Thread until the stored proc execution is done. So The UI won't be updated until then. Left by Nat on Oct 26, 2004 11:36 AM

# re: Report progress from SQL Server

try change ur method to be like this... private void ProgressStatus(object sender,SqlInfoMessageEventArgs e) { if (e.Errors.Count>0) {

string message = e.Errors[0].Message; int state = e.Errors[0].State; Form1 F1 = new Form1(); F1.label4.Text=message; this.BeginInvoke(new MethodInvoker(F1.progressBar1.PerformStep()); this.BeginInvoke(new MethodInvoker(F1.progressBar1.Refresh()); Application.DoEvents(); } Left by Nat on Oct 26, 2004 10:39 AM

# re: Report progress from SQL Server

Hi, Thanks for your answers... Unfortunately, still does not work! the methode invoker asked me for "Method".... don't know really what to do... I even tried to use MDI.. Thanks for your help. Frederic Left by Frederic Zawadzki on Oct 29, 2004 6:33 AM

# re: Report progress from SQL Server

Put the code that calls the stored procedure in a seperate thread and make sure not to use executenonquery even if you're not returning records. Left by Greg on May 09, 2005 2:28 PM

# re: Report progress from SQL Server

Try the following code to make it work: sqlCommand = sqlConnection.CreateCommand(); sqlCommand.CommandText = "EXEC your_stproc"; sqlCommand.CommandTimeout = 0; sqlDataReader = sqlCommand.ExecuteReader(Commandbehaviour.CloseConnection); Good luck, Ted. Left by Ted on Oct 04, 2005 1:36 AM

# re: Report progress from SQL Server

Anyone have any ideas how to get the Percent Complete of a Restore or backup operation? I'm trying to make it so that I can get progress for TSQL commands for backup and restore just like Enterprise Manager does and I can't seem to get it to report the status until the end, using the above way, and NOWAIT doesn't seem to be valid on the Restore or Backup TSQL commands. Thanks! Left by James Hancock on Mar 19, 2006 8:58 PM

# re: Report progress from SQL Server

Very good article. It works with SQLInfoMessageEventHandler, unfortunately it doesn't work perfectly with OleDbInfoMessageEventHandler as it seems you can get just the message and not the state (SQLState) for OleDb. Left by Rosario on Sep 05, 2006 2:19 AM

# re: Report progress from SQL Server

@James Hancock: For management-type operations like backup/restore you want to use DMO (2000/native) or SMO (2005/managed). In DMO you must create a COM object that exposes certain interfaces (PercentComplete, Complete, NextMedia) and AtlAdvise to a DMO restore object. SMO is much nicer, you register EventHandlers with aMicrosoft.SqlServer.Management.Smo.Restore object. Seehttp://www.codeproject.com/useritems/BackupRestoreWithSmo.asp Left by Aidan Ryan on May 02, 2007 7:32 AM

# re: Report progress from SQL Server

Great work, This was exactly what I needed, those pregnant pauses as I upload data are now gone and a progress bar and message system prevail.

Thank you! Left by Paul on Dec 11, 2008 12:43 AM

Your comment:
Title: Name: Email: (never displayed) Comment: Allowed tags: blo (will show your gravatar)
re: Report pro

Geek Blog
<< Humor Flash Acerca de Poltica | Inicio | A la contratacin de tipo Worth >>

Informe sobre la marcha de SQL Server


Comentarios (12) | Compartir

A veces, la aplicacin podra estar centrada en la base de datos muy. Puede que tenga que resumir / recuperar datos de una gran base de datos. Por lo tanto, la consulta puede tardar mucho tiempo en ejecutarse de tal manera que el usuario no puede desnudar para ver una pantalla de cada durante varios segundos o minutos sin ver ningn progreso. Para resolver este problema, es posible que ya sea crear algo como GIF es decir, iconos animados o de reloj de arena rebotando barra de progreso como FireFox instalador o realmente avisar al usuario sobre la marcha de la consulta. Es bastante simple de hacer eso con ADO.NET / SQL Server. Usted puede simplemente conectar un evento para SqlInfoMessageEventHandler como esto .....
{ SqlConnection sqlConnection Ejecute su operacin de larga ejecucin }

private void ProgressStatus (object sender, SqlInfoMessageEventArgs e) { si ( e.Errors.Count> 0 ) {

String mensaje = e.Errors [0] Mensaje;. int estado = e.Errors [0] Estado;. / / Establecer estado de la barra de progreso } }

y en su declaracin de sql / procedimiento almacenado si tiene varias sentencias a ejecutar, podra elegir reportar la situacin entre esas declaraciones es decir,
SELECT ............ DE .......... INNER JOIN ............. INNER JOIN ............RAISERROR ( 'Mensaje' , 10,25) WITH NOWAIT SELECT ............ DE .......... INNER JOIN ............. INNER JOIN ............ RAISERROR ( 'Mensaje' , 10,50) WITH NOWAIT SELECT ............ DE .......... INNER JOIN ............. INNER JOIN ............ RAISERROR ('Mensaje' , 10,75) WITH NOWAIT SELECT ............ DE .......... INNER JOIN .............INNER JOIN ............ RAISERROR ( 'Mensaje' , 10100) WITH NOWAIT

NOWAIT opcin forzar que el mensaje sea entregado al cliente inmediatamente en lugar de esperar hasta que todo est hecho. Para utilizar esta opcin correctamente, es necesario asegurarse de que RPC es la forma de comunicacin ... en el que debera ser por defecto. As que cada vez que el procedimiento almacenado termina de ejecutar la primera sentencia, RAISERROR se llamar y causando ProgressStatus que se llamar y entonces usted puede actualizar el estado. Asegrese de que ejecuta DataAdapter.Fill o SqlCommand.ExecuteReader en un hilo separado que no es hilo de interfaz de usuario.De lo contrario, la barra de progreso no se puede actualizar correctamente. Si usted es perezoso, puede utilizarApplication.DoEvents a dar un poco de tiempo para volver a pintar la barra de progreso.
Enviado el Lunes, 20 de septiembre 2004 23:43 | Volver arriba

Los comentarios sobre este post: informe de situacin de SQL Server


# re: informe de situacin de SQL Server

Por favor, ayuda! He intentado esto lo que escribi all, y en mi caso, la aplicacin est recuperando informacin al final (la barra de progreso se actualiza al final del procedimiento almacenado ...) Qu hice mal?Podra dar me un ejemplo completo donde esto funciona? Gracias Frederic

Atribuida por Frederic Zawadzki en 25 de octubre 2004 10:28 AM

# re: informe de situacin de SQL Server

1. Asegrese de que utiliza "WITH NOWAIT" declaracin despus RAISERROR. 2. Si lo hace y todava no funciona. Compruebe la cadena de conexin. No tengo ni idea, pero me imagino que la conexin TCP / IP es la mejor apuesta (especificar "Red de Bibliotecas = DBMSSOCN;" en la cadena de conexin). Puede que no funcione si se conecta a travs de RPC. 3. Tambin asegrese de que usted no utiliza ExecuteNonQuery () ya ExecuteNonQuery puede recopilar informacin y desencadenar el evento slo cuando todo est hecho. Atribuida por Nat. en 25 de octubre 2004 23:07

# re: informe de situacin de SQL Server

Por desgracia! Ninguno o aquellos solucin .... aqu est mi cdigo: En el Form1 tengo un botn que se llama a una clase: private void btnOK_Click (object sender, System.EventArgs e) { string Conn = "Red de Bibliotecas = DBMSSOCN, contrasea = "+ textBox3.Text +"; Persiste la seguridad Info = True; ID de usuario = "+ textBox2.Text +"; Initial Catalog = paneuropea; Data Source = "+ textBox1.Text; UpdateData UD = new UpdateData (); UD.Load (Conn ); } esta es mi clase: using System; utilizarSystem.Data.SqlClient ; utilizando System.Data ; utilizando System.Windows.F orms ; PanEuropean espacio de nombres { / / / <summary> Descripcin / / / Resumen para UpdateData. / / / </ summary> public class UpdateData { UpdateData pblica () { / / / / TODO: Agregar constructor lgica aqu / / } public void Load (string e) { conexin SqlConnection = new SqlConnection (e);pruebe { Connection.Open (); connection.InfoMessage + = new SqlInfoMessageEventHandler (ProgressStatus); } catch (Exception) { MessageBox.Show ("La conexin no es posible por favor verifique los parmetros de conexin!"); Application.Exit (); } comando SqlCommand = new SqlCommand (); transaccin SqlTransaction Actualizacin se ha completado "); } catch (Exception ex) { MessageBox.Show ("Excepcin que se produce cuando la actualizacin de DB: ",ex.Message ); Transaction.Rollback (); } } private void ProgressStatus (object sender, SqlInfoMessageEventArgs e) { if ( e.Errors.Count> 0 ) { string message = e.Errors [0] Mensaje;. . int estado = e.Errors [0] Estado; Form1 F1 = new Form1 (); F1.label4.Text = mensaje ;F1.progressBar1.PerformStep (); F1.progressBar1.Refresh (); } } } } Por favor, podras echarle un vistazo Gracias? Frederic

Barra de progreso en la tarea del SQL RSS


4 respuestas
ltimo mensaje 12 de septiembre 2013 03:41 AM por aspn00bie

<Tema anterior | Tema siguiente> o Responder

aspn00bie
Miembro 114 Puntos 86 Mensajes

Barra de progreso en la tarea del SQL


10 de septiembre 2013 21:32 | ENLACE

Hola a todos, Estoy buscando una solucin a los usuarios mostrar el estado de un mdulo de carga que he creado. Construyo una funcin para analizar los datos CSV en SQL usando C # y asp.net. Cuando

hago clic en el botn de subida, el navegador muestra la seal de carga. Por ejemplo, IE tendr el crculo que gira. Hay una manera de construir una barra de progreso para mostrar el estado de la parasing y SQL para subir archivos? Si eso es que es posible, puedo crear algn tipo de animacin para que el usuario sepa que los datos sigue siendo igual carga, tiene un crculo de giro y desactivar el navegador web hasta que todo el proceso se termina? Incluso me atrevera a conformarse con la etiqueta / cuadro de texto que muestra la palabra "Procesamiento en curso". No quiero que el usuario interupt el proceso mediante el cierre del navegador mientras el mdulo est en el medio de anlisis de su archivo. Cualquier idea sera muy apreciada. o Responder

AceCorban
Estrella 14.018 Puntos 2551 Mensajes

Re: Barra de progreso en la tarea del SQL


10 de septiembre 2013 21:44 | ENLACE

"Upload Progress" es un nombre poco apropiado en el mundo de las aplicaciones web. La principal razn es que en una subida clsica, se enva la solicitud, y la nica vez que reciba ninguna notificacin desde el servidor es cuando la carga se ha completado, por lo que el servidor no puede enviar respuestas peridicas a medida que se trabaja. Eso no es slo cmo funciona el protocolo HTTP. Cuntas aplicaciones simular la barra de progreso es a travs de "fragmentacin". En fragmentacin, un archivo se divide en trozos ms pequeos y cada trozo se enva como una carga separada. El servidor procesa la carga y responde cuando el trozo ha terminado de cargar, y en ese momento, el javascript se actualiza la barra de progreso con un porcentaje basado en el nmero de trozos que fueron enviados (por ejemplo, si 10 trozos enviadas, javascript enva 10 de subida peticiones y aade un 10% a la barra cada vez que una respuesta exitosa regresa). Dicho esto, tcnicamente, el usuario podra interrumpir el progreso con un modelo chunking si cierran el navegador antes de todos los bloques han sido enviados. Otra posibilidad que no he jugado con es el envo de una carga, y enviar solicitudes peridicas sobre el estado. He aqu un ejemplo de ello: http://www.codeproject.com/Articles/113418/ASP-NET-File-Upload-with-Progress-Bar Huelga decir que esto no es una caracterstica simple, hay una gran cantidad de movimiento piezas que tienen que venir juntos. Yo personalmente uso el mtodo de fragmentacin mediante la biblioteca js "plupload" para manejar el lado fragmentacin javascript:

http://www.plupload.com/ Y algo de cdigo del lado del servidor para combinar los archivos en uno solo cuando todo est dicho y hecho. Puedo compartir el cdigo del servidor si decide ir por ese camino.
"Suea como si fueras a vivir para siempre, vive como si fueras a morir hoy." - James Dean

Responder

aspn00bie
Miembro 114 Puntos 86 Mensajes

Re: Barra de progreso en la tarea del SQL


11 de septiembre 2013 20:38 | ENLACE

Hola Ace, Usted habla de algo que podra ser una solucin para m. La carga de enviar la solicitud y el servidor enviar una notificacin de vuelta cuando se ha completado la tarea.Cmo se puede obtener el acabado de responder desde el servidor. Si puedo manejar algo para saber cuando el trabajo se ha completado, lo que podra ser capaz de hacer es mostrar un mensaje como .. Subir en curso y una vez que el servidor enve la notificacin final, slo puedo mostrar un mensaje de finalizacin. Realmente no necesito una barra de progreso ya que la tarea parece ser un poco complicado. Slo quiero que el usuario saber cuando se inicia el trabajo y cuando lo termine. Adems, me doy cuenta de que una vez que haga clic en el botn de subida, el navegador entra en un estado de carga y cuando el archivo de datos est completamente subida, que salir fuera del estado de carga del navegador. De todos modos para m para capturar el estado broswer? Gracias ... o Responder

AceCorban
Estrella 14.018 Puntos 2551 Mensajes

Re: Barra de progreso en la tarea del SQL


11 de septiembre 2013 21:52 | ENLACE

Bueno, si usted no est realmente preocupado por una barra de progreso, usted tiene algunas opciones ms disponibles para usted. La forma habitual de hacer las cosas est utilizando un type = "file" de entrada y el procesamiento de la carga mediante el acceso Request.Files [0] y guardarlo en el disco. Este mtodo utiliza una devolucin de datos, sin embargo, por lo que no tendr mucho tiempo para mostrar un gif "carga" de ningn tipo, ya que la propia pgina refreshses. Sinceramente, no estoy seguro de lo que sucede en una salida de usuario en este caso, ya que la carga puede no ser completa, pero la solicitud ya ha sido enviado. Puede que tenga que experimentar slo por curiosidad. Si desea ms de una carga de "aplicacin rica de Internet", donde la pgina no se actualiza, todava hay un nmero de maneras de manejar esto. La ms antigua de las cuales se basa en IFrames. En este artculo se muestra el cdigo del lado del cliente de cmo podra poner esto en marcha: http://viralpatel.net/blogs/ajax-style-file-uploading-using-hiddeniframe/

El largo y corto de l es que la trama est oculto, pero contiene un formulario con una accin que haga referencia a una clase de servidor se materializar. Cuando el usuario hace clic en el botn "Subir" para la carga, el javascript enva el formulario en el Iframe mientras que el resto de la pgina de espera. Es aqu donde usted puede ocultar el type = "file" de entrada y mostrar un icono de la "carga" de algn tipo. Si todo el cableado manual es demasiado para usted, para empezar, mirar en el control AsyncFileUpload previsto por

"Suea como si fueras a vivir para siempre, vive como si fueras a morir hoy." - James Dean

Marcado como respuesta Terry Guo - MSFT el 17 de septiembre 2013 02:49 AM

Responder

aspn00bie
Miembro 114 Puntos 86 Mensajes

Re: Barra de progreso en la tarea del SQL


12 de septiembre 2013 03:41 AM | ENLACE

Hola Ace, Gracias por su ayuda. He decidido utilizar el Ajax AsyncFileUpload. La otra ruta requiere demasiada cableando cdigo y no quiero pasar demasiado tiempo en l. Ajax va a trabajar para m. Gracias de nuevo ...
Ads by Google

LAN : Pasajes Nacionales


Descubre el Per y sus Maravillas. Pasajes Desde $94 S/260 Ingresa! www.lan.com
18th Jun 2004 Cor Ligthert
Guest Posts: n/a

Hi Adriano, As far as I know can this can only be done when you are using the datareader by your own code to fill the dataset.Using the dataadapter it is a one time method which has no events for the fill. (What you ask is possible while updating). Probably a lot of work for a progress bar, just using an avi or an animated gif gives in my idea almost the same result. I hope this helps? Cor > can anyone help me to make progress bar in the status bar that will show the > status of SQL data loading into dataset, > > tnx in advance, > > Adriano > >

Ads by Google

Maquinaria Trituracin
Equipos de trituracin de ridos para industria y minera carpay.cl/trituracion

18th Jun 2004 Adriano


Guest Posts: n/a

hello Cor, i used to see this in one program, that's why i'm asking, the SQL server is located in remote computer and sometimes it takes long to load, do you have any ideas how to do that? tnx in advance, Adriano

"Cor Ligthert" <(E-Mail Removed)> wrote in message news:O7$(E-Mail Removed)... > Hi Adriano, > > As far as I know can this can only be done when you are using the datareader > by your own code to fill the dataset.Using the dataadapter it is a one time > method which has no events for the fill. (What you ask is possible while > updating). > > Probably a lot of work for a progress bar, just using an avi or an animated > gif gives in my idea almost the same result. > > I hope this helps? > > Cor > > > can anyone help me to make progress bar in the status bar that will show > the > > status of SQL data loading into dataset, >> > > tnx in advance, >> > > Adriano >> >> > >

18th Jun 2004 Cor Ligthert


Guest Posts: n/a

Hi Adriano, Keep in mind that it will not make your process faster, have a look why the

loading of the data is so slow. You can look in this thread http://groups.google.com/groups?hl=e...amework.adonet And you see answers however than it is mostly for the update and than people see that after a while. Bernie Yaeger is very much been busy with it, so maybe you can find something using his name in a search. The best place to ask questions how to make your process faster is in the newsgroup Adonet <news://msnews.microsoft.com/microsoft.public.dotnet.framework.adonet> Web interface: <http://communities2.microsoft.com/co...s/?dg=microsof t.public.dotnet.framework.adonet>

I hope this helps? Cor

18th Jun 2004 Adriano


Guest Posts: n/a

I know that it's not gonna make database load faster, i just want to learn how to do that, regards, Adriano

"Cor Ligthert" <(E-Mail Removed)> wrote in message news:(E-Mail Removed)... > Hi Adriano, > > Keep in mind that it will not make your process faster, have a look why the > loading of the data is so slow. > > You can look in this thread > http://groups.google.com/groups?hl=e...amework.adonet > > And you see answers however than it is mostly for the update and than people > see that after a while. > > Bernie Yaeger is very much been busy with it, so maybe you can find

> something using his name in a search. > > The best place to ask questions how to make your process faster is in the > newsgroup > > Adonet > <news://msnews.microsoft.com/microsoft.public.dotnet.framework.adonet> > > Web interface: > > <http://communities2.microsoft.com/co...s/?dg=microsof > t.public.dotnet.framework.adonet> > > > I hope this helps? > > Cor > >

18th Jun 2004 Bernie Yaeger


Guest Posts: n/a

Hi Adriano, It's not too difficult. Start by adding a timer and a progress bar to the form, and add a public variable to the form class as Public alarmcounter As Integer = 1 Then set the timer in the load event: timer1.start Add a timer_tick method with this code: alarmcounter += 1 If alarmcounter > 2 Then Timer1.Stop() loader.PerformClick() End If 'loader' is a button control that simply says 'Loading....' and is set not to be able to be clicked. However, it does have a click event, thus the performclick above. Then this in the click event:

loader.Enabled = False

me.parent.cursor = Cursors.WaitCursor Application.DoEvents() If gl_sqlexpression = "6 <> 7" Then Me.SqlSelectCommand1.CommandText = "SELECT rinvnum, invnum, qty, title, brname, bipad, issuecode, imcacct, uprice, cprice, shi" & _ "p_dt, billed, onsaledt, bipterms, ptype, rectype, isquart, raf, ponumber, vflag, mcycle," & _ " rowid FROM invdet" Else Me.SqlSelectCommand1.CommandText = "SELECT rinvnum, invnum, qty, title, brname, bipad, issuecode, imcacct, uprice, cprice, shi" & _ "p_dt, billed, onsaledt, bipterms, ptype, rectype, isquart, raf, ponumber, vflag, mcycle," & _ " rowid FROM invdet WHERE " & gl_sqlexpression '" rowid FROM invdet WHERE bipad in ('18770', '18778', '01503')" End If SqlDataAdapter1.SelectCommand.CommandTimeout = 1200 Me.SqlDataAdapter1.SelectCommand = Me.SqlSelectCommand1 If Mid(gl_sqlexpressioncount, 1, 1) <> "z" Then gl_sqlexpressioncount = gl_sqlexpression End If Dim oconn As New SqlConnection(globalconnectionstring) oconn.ConnectionString = globalconnectionstring oconn.Open() Dim cmd As SqlCommand = oconn.CreateCommand()

cmd.CommandText = "select count(*) from invdet WHERE (ship_dt >= " & Chr(39) & gl_browsestartdate & Chr(39) & ")" cmd.CommandText = "select count(*) from invdet where " & gl_sqlexpressioncount cmd.CommandTimeout = 1200 Dim rows As Integer If Mid(gl_sqlexpressioncount, 1, 1) = "z" Then rows = CInt(Mid(gl_sqlexpressioncount, 2)) Else Try rows = CInt(cmd.ExecuteScalar) Catch ex As Exception MessageBox.Show(ex.Message) End Try End If oconn.Close() Dim dt As DataTable dt = Invdetds2.Tables(0) AddHandler dt.RowChanged, New DataRowChangeEventHandler(AddressOf DataTableRow_Changed) pbar.Maximum = rows pbar.Step = pbar.Maximum / 30 pbar.Visible = True pbar.Minimum = 1 ' Set the initial value of the ProgressBar. pbar.Value = 1 pbar.PerformStep() Try Me.SqlDataAdapter1.Fill(Me.Invdetds2)

Catch ex As Exception MessageBox.Show("Invalid SQL Expression", "SQL Error", MessageBoxButtons.OK, MessageBoxIcon.Hand) Me.Close() Exit Sub End Try The key is an event called datatablerow_changed, which is added via addhandler in the code above; here's the code for the datatablerow_changed event: Public Sub DataTableRow_Changed(ByVal Sender As Object, ByVal e As System.Data.DataRowChangeEventArgs) ' The DataRow has changed. update pbar glf_icount += 1 If glf_icount > (pbar.Maximum / 15) Then glf_icount = 0 pbar.PerformStep() Application.DoEvents() End If Once the table loads, simply make the button and the progress bar invisible. HTH, Bernie Yaeger "Adriano" <(E-Mail Removed)> wrote in message news:%(E-Mail Removed)... > Hello, > > can anyone help me to make progress bar in the status bar that will show the > status of SQL data loading into dataset, > > tnx in advance, >

> Adriano > >

18th Jun 2004 Sahil Malik


Guest Posts: n/a

Yup, see RowChanging and RowChanged events. I learnt this right here on these news groups. - Sahil Malik Independent Consultant You can reach me thru my blog http://dotnetjunkies.com/WebLog/sahilmalik/

"Adriano" <(E-Mail Removed)> wrote in message news:%(E-Mail Removed)... > Hello, > > can anyone help me to make progress bar in the status bar that will show the > status of SQL data loading into dataset, > > tnx in advance, > > Adriano > >

18th Jun 2004 Greg Burns


Guest Posts: n/a

might have something useful here: http://www.fawcette.com/vsm/2004_06/...s/default.aspx "Adriano" <(E-Mail Removed)> wrote in message news:%(E-Mail Removed)... > Hello, > > can anyone help me to make progress bar in the status bar that will show the > status of SQL data loading into dataset, > > tnx in advance, > > Adriano > >

Show Progress Bar for SQL Statement


VISUAL FOXPRO 9.0 - This code snippet that I created is an example of how you can show a progress bar while waiting for an SQL query to finish. However, this is not recommended for SQL statements with a WHERE clause. (And this is not considered to be among the best practices. :) )

Local loObjForm loObjForm = Createobject('SampleForm') loObjForm.Show(1) Define Class SampleForm As Form AutoCenter = .T. Height = 100 Width = 400 Add Object Container1 As Container With Left = 10, ; WIDTH = 380, SpecialEffect = 1, Top = 20, Height = 15 Add Object Shape1 As Shape With Left = 10, Width = 0, ; TOP = 20, Height = 14, FillColor = Rgb(111,111,111), ; FillStyle = 0 Procedure Load *-- Opens products table from VFP9 Home Dir, if the said ; table doesn't exist please modify Use 'c:\PROGRAM FILES\microsoft VISUAL FOXPRO 9\'+; 'samples\DATA\products' In 0 Endproc Procedure Activate Local lnCount lnCount = Reccount('Products') Select *, This.MoveBar(m.lnCount,Recno()) ; From Products Into Cursor NewProducts Browse Normal Endproc Procedure MoveBar

Lparameters lnParam1, Thisform.Shape1.Width * (lnParam2/lnParam1) Wait '' Timeout .1 && growth so we can see, Endproc Enddefine

lnParam2 = Thisform.Container1.Width ; Added just to slow down its ; better removed to speed up the process

Mostrar barra de progreso para la instruccin SQL


Visual FoxPro 9.0 - Este fragmento de cdigo que he creado es un ejemplo de cmo se puede mostrar una barra de progreso mientras se espera una consulta SQL para terminar. Sin embargo, esto no es recomendable para las sentencias de SQL con una clusula WHERE. ( Y esto no es considerado como una de las mejores prcticas. :))

Local loObjForm loObjForm = Createobject ( 'SampleForm' ) loObjForm. Mostrar (1) Definir la clase SampleForm Como AutoCenter =. T. Altura = 100 Ancho = 400 Forma

Aadir Object Container1 Como Container Con Left = 10,; ANCHO = 380, SpecialEffect = 1, Top = 20, Altura = 15 Aadir Object Shape1 Como Forma Con Left = 10, Ancho = 0,; TOP = 20, Altura = 14, FillColor = Rgb (111111111),; FillStyle = 0 Procedimiento de carga * - Abre mesa productos de VFP 9 Inicio Dir, si dicho; tabla no existe modifique Uso 'c: \ Archivos de programa \ Microsoft Visual FoxPro 9 \' +; 'Samples \ Data \ productos " En 0 endproc Procedimiento Local lnCount Activar

lnCount = Reccount ( "Productos" ) Select *, Este . MoveBar (m.lnCount, regnum ()); De Productos Into Cursor NewProducts Navegar normal endproc Procedimiento MoveBar LPARAMETERS lnParam1, lnParam2 THISFORM Shape1.. Ancho = THISFORM Container1.. Ancho ; * (LnParam2/lnParam1) Espere '' Tiempo de espera de 0,1 && Agregado slo para frenar su; crecimiento por lo que podemos ver, mejor eliminarse para acelerar el proceso de endproc Enddefine

Visual Basic - VER AVANCE DE PROGRESSBAR MIENTRAS SE EJECUTA SQL

Buscar

Volver

Agregar Nota <<>>

Vista:

arbol

VER AVANCE DE PROGRESSBAR MIENTRAS SE EJECUTA SQL Minombre (03/08/2006 20:59:42)3.852 visitas 5 respuestas

RE:VER AVANCE DE PROGRESSBAR MIENTRAS SE EJECUTA S gon (03/08/2006 23:08:56)

RE:VER AVANCE DE PROGRESSBAR MIENTRAS SE EJECUTA S pelicano (03/08/2006 23:25:25)

RE:VER AVANCE DE PROGRESSBAR MIENTRAS SE EJECUTA S Minombre (04/08/2006 05:10:45)

RE:VER AVANCE DE PROGRESSBAR MIENTRAS SE EJECUTA S gon (04/08/2006 14:08:13)

RE:VER AVANCE DE PROGRESSBAR MIENTRAS SE EJECUTA S Minombre (04/08/2006 18:54:06)

As un to:

VER AVAN CE DE PROG RESSB AR MIENT RAS SE EJECU TA SQL Mino mbre (30 interv encio nes) 03/08 /2006 20:59: 42

Au tor :

Fe ch a:

Seores: Alguien sabe o tiene alguna idea de cmo hacerle para ver el avance de un progressbar mientras se ejecuta un query de sql (select, insert, update,delete, backup,restore, etc). De tal manera que cuando llego a la lnea de cdigo que dice: miconexion.execute(sql) (donde sql es el query) el progressbar avance hasta que se termine de ejecutar el query con un valor de 100%. Espero y alguien pueda ayudarme. Saludos

Responder

Otras secciones de LWP con contenido similar... - Cursos de Visual Basic - Temas de Visual Basic - Cdigo fuente de Visual Basic

As un to:

RE:VE R AVAN CE DE PROG RESSB AR MIENT RAS SE EJECU TA S gon (2 7 interv encio nes) 03/08 /2006 23:08: 56

Au tor :

Fe ch a: proba asi progress.max=rs.recordcount progress.min=0 preogress.value=0

do while not rs.eof miconexion.execute(sql) progress.value=progress.value +1 rs.movenext loop si no te sale avisa que lo arreglamos saludos Comentar

As un to:

RE:VE R AVAN CE DE PROG RESSB AR MIENT RAS SE EJECU TA S pelica no (5 interv encio nes) 03/08 /2006 23:25: 25

Au tor :

Fe ch a: pos aber como lo arreglamos porque no me sale.

Comentar

As un to:

RE:VE R AVAN CE DE PROG RESSB AR MIENT RAS SE EJECU TA S Mino mbre (4 interv encio nes) 04/08 /2006 05:10: 45

Au tor :

Fe ch a:

Agradezco tu colaboracin, pero el cdigo no funciona precisamente como como debe ser, ya que para empezar no siempre utilizo un recordset (rs), y adems el cdigo que dice: miconexion.execute(sql) se ejecuta tantas veces como registros tenga el rs; es decir , si sql="update mitabla set campo1='valor1'" entonces va a hacer rs.recordcount veces lo mismo ests de acuerdo? y lo que quiero hacer es que mientras se ejecuta el query, es decir miconexion.execute(sql) el progressbar est subiendo hasta que termine de ejecutarse la sentencia miconexion.execute(sql) Alguna otra idea? De antemano, te agradezco. Saludos

Comentar

As un to:

RE:VE R AVAN CE DE PROG RESSB AR MIENT RAS SE EJECU TA S gon (2 7 interv encio nes) 04/08 /2006 14:08: 13

Au tor :

Fe ch a:

El progress te va a mostrar la cantidad de veces que hagas algo, di vos haces un update de una sola ves para visual basic solo haces una sola accion, el resto se encarga la base de datos, hay que ver si el motor de la base de datos te va entregando un registro de que cantidad de registros va modificando. pienso que es asi, por ahi alguien lo tiene echo y te lo pasa saludos Comentar

As un to:

RE:VE R AVAN CE DE PROG RESSB AR MIEN TRAS SE EJECU TA S Mino mbre (1 interv enci n) 04/08 /2006 18:54 :06

Au tor :

Fe ch a: Pues si alguien tiene algo parecido pues que comparta y se lo agradecer

SQL Server 2005 Circular Progress Bar


By ateece, 26 Sep 2006 Sign Up to vote vote 1vote 2vote 3vote 4vote 5
inShare0

4.86 (68 votes)

Download source files - 11.3 Kb Updated to include double buffering Download demo project - 37.9 Kb Download C# 1.1 source code - 17 Kb Conversion by Olof Szymczak Download C# 2.0 source code - 29.8 Kb Conversion by Olof Szymczak

Introduction
After initially searching for the animation used in SQL Server 2005 as an AVI or GIF, I stumbled across the excellent article by Amr Aly Elsehemy, here at The Code Project. Although good code, and indeed a starting point for what I have created, it didn't actually replicate the look and feel of the Microsoft SQL Server 2005 'busy' animation. At less than 220 lines, I think that this control is pretty compact, and it seems to perform well, even when other threads in my application are busy.

Code
I store each 'segment' of the progress bar in an array, this makes it easy to iterate through later.
Collapse | Copy Code

Private segmentPaths(11) As Drawing2D.GraphicsPath

The segments are initialized in the CalculateSegments method, which is called when the control is initialized or resized. This method also generates a region which is used to clip the center circle back out when painting the control.
Collapse | Copy Code

'Create 12 segment pieces For intCount As Integer = 0 To 11 secmentPaths(intCount) = New Drawing2D.GraphicsPath 'We subtract 90 so that the starting segment is at 12 o'clock secmentPaths(intCount).AddPie(rctFull, (intCount * 30) - 90, 25) Next

The ProgressDisk_Paint method is where all the real work goes on (with the exception of the automatic iteration). I think the code speaks for itself, especially the comments
Collapse | Copy Code

e.Graphics.SmoothingMode = Drawing2D.SmoothingMode.AntiAlias e.Graphics.ExcludeClip(innerBackgroundRegion) For intCount As Integer = 0 To 11 If Me.Enabled Then If intCount = m_TransitionSegment Then 'If this segment is the transistion segment, colour it differently e.Graphics.FillPath(New SolidBrush(m_TransistionColour), _ segmentPaths(intCount)) ElseIf intCount < m_TransitionSegment Then 'This segment is behind the transistion segment If m_BehindIsActive Then 'If behind the transistion should be active, 'colour it with the active colour e.Graphics.FillPath(New SolidBrush(m_ActiveColour),_ segmentPaths(intCount)) Else 'If behind the transistion should be in-active, 'colour it with the in-active colour e.Graphics.FillPath(New SolidBrush(m_InactiveColour), _ segmentPaths(intCount)) End If Else 'This segment is ahead of the transistion segment If m_BehindIsActive Then 'If behind the the transistion should be active, 'colour it with the in-active colour e.Graphics.FillPath(New SolidBrush(m_InactiveColour),_ segmentPaths(intCount)) Else 'If behind the the transistion should be in-active, 'colour it with the active colour e.Graphics.FillPath(New SolidBrush(m_ActiveColour),_ segmentPaths(intCount))

End If End If Else 'Draw all segments in in-active colour if not enabled e.Graphics.FillPath(New SolidBrush(m_InactiveColour), _ segmentPaths(intCount)) End If Next

The only other real work is done by the timer increment, which is fired by default every 100ms, but this is exposed as a property.
Collapse | Copy Code

If m_TransitionSegment = 11 Then m_TransitionSegment = 0 m_BehindIsActive = Not m_BehindIsActive ElseIf m_TransitionSegment = -1 Then m_TransitionSegment = 0 Else m_TransitionSegment += 1 End If Invalidate()

The m_BehindIsActiv

carlosrdunt
Junior Member Site Admin ProgressBar y consultas en sql

Registrado: nov 2007 Posts: 3 Crditos: 163

hola a todos, esoty haciendon un programa con base de datos y quieor mostra la informacion de una tabla en un listview pero demora en cargar porque mi tabla tiene mas de 2000 registro y quieor colocar un progressbar para simular el timpo que falta para que acabe de llenar mi listview, qisiera saber como se puede lograr esto o simular, me dicen que con hilos se puede hacer pero quisiera un ejemplo gracias de antemano

#2 (permalink) 19-11-2007, 17:53:42

GaLLeGo
Buena Participacin en el Foro

Registrado: nov 2007 Ubicacin: Investigacin y Desarrollo (I+D) Posts: 65 Crditos: 253

Hola y bienvenido carlosrdunt, Aqu tienes un ejemplo Saludios

#3 (permalink) 19-11-2007, 18:25:35

carlosrdunt
Junior Member Site Admin

Registrado: nov 2007 Posts: 3 Crditos: 163

hola gracias por ejemplo pero ademas, no sabras mas sobre hilos para hacer los dos procedimientos a la vez, es decir el llenado de mi consulta en el listview y el progreso de mi progressbar, por ahi he visto con brackgroundworker, aver si me puedes dar una ayuda porq me urge o sino como simular estos procesos simultaneos. gracias de antemano, estoy trabajando con la version vb 2005 y con sql 2005 bye

#4 (permalink) 20-11-2007, 23:41:05

telu
Gran Participacin en el Foro

Registrado: jul 2007 Posts: 127 Crditos: 2.866

Hola amigo, No s nada de hilos, pero no probaste simplemente con un Timer que vaya cargando la barra en el evento Tick y que vaya haciendo cada vez mas grande el Interval, de modo que, a medida que la barra avanza, se vaya haciendo mas lenta. No se si se actualizar mietras se estn cargando los registros. Ejemplo: Private sub Timer1_Tick(................

.......... Try Timer1.Interval = 100 + Timer1.Interval * Bar.Value / 75 If Bar.Value < 100 Then Bar.Value += 1 Catch End Try ......... __________________ Es ms fcil desintegrar un tomo que un preconcepto. Einstein

Mostrar barra de Progreso en un Select SQL


Visual Fox Pro, TrucosAgregar Comentarios

A muchos les gustara mostrar una barra de progreso en sus consultas Select SQL; no es muy bueno hacerlo puesto que al estar activo el Set Talk las consultas tardara mucho ms; pero si an as quieres utilizarla.... Para poder ver la barra la tabla debe tener bastantes registros....

Define Window WinSQL From 12,30 To 16,70; SHADOW Color Scheme5 Double Name loWind Active Window WinSQL Noshow Set Talk Window WinSQL Set Talk On Set Notify On Select * From Tabla Release Window WinSQL

Usando Visual Fox 8 con dbf nativos , al usar el select sql , hay manera de lograr ver el avance de la consulta por medio de una barra de progreso ??? Gracias por su atencion LUIS

Luis Mara Guayn hace 5 aos


Una opcin: -- Mostrar el porcentaje de ejecucin de un comando SELECT o USE VIEW -http://www.portalfox.com/index.php?name=News&file=article&sid=46 -Luis Mara Guayn Tucumn, Argentina ________________________________ SysOp de www.PortalFox.com

Microsoft Visual FoxPro MVP ________________________________ La palabra imposible solo figura en el diccionario de los tontos
Post by Desarrollos A.M. Usando Visual Fox 8 con dbf nativos , al usar el select sql , hay manera de lograr ver el avance de la consulta por medio de una barra de progreso ??? Gracias por su atencion LUIS

Daniel Flores hace 5 aos


Hola Luis, Gracias por responder. Yo entre a esta pagina y me copie el codigo de la misma, pero no se donde tengo que poner la definicion de clase. Me podes explicar como se implemente este codigo?? Gracias Daniel Flores
Post by Luis Mara Guayn -- Mostrar el porcentaje de ejecucin de un comando SELECT o USE VIEW -http://www.portalfox.com/index.php?name=News&file=article&sid=46 -Luis Mara Guayn Tucumn, Argentina ________________________________ SysOp de www.PortalFox.com Microsoft Visual FoxPro MVP ________________________________ La palabra imposible solo figura en el diccionario de los tontos Post by Desarrollos A.M. Usando Visual Fox 8 con dbf nativos , al usar el select sql , hay manera de lograr ver el avance de la consulta por medio de una barra de progreso ??? Gracias por su atencion LUIS

Luis Mara Guayn hace 5 aos


Un lugar puede ser tu archivo de procedimientos, donde en tu PRG principal este la lnea SET PROCEDURE MiArchivoProcedimientos.PRG ADDITIVE -Luis Mara Guayn Tucumn, Argentina ________________________________ SysOp de www.PortalFox.com Microsoft Visual FoxPro MVP ________________________________

La palabra imposible solo figura en el diccionario de los tontos


Post by Daniel Flores Hola Luis, Gracias por responder. Yo entre a esta pagina y me copie el codigo de la misma, pero no se donde tengo que poner la definicion de clase. Me podes explicar como se implemente este codigo?? Gracias Daniel Flores Post by Luis Mara Guayn -- Mostrar el porcentaje de ejecucin de un comando SELECT o USE VIEW -http://www.portalfox.com/index.php?name=News&file=article&sid=46 -Luis Mara Guayn Tucumn, Argentina ________________________________ SysOp de www.PortalFox.com Microsoft Visual FoxPro MVP ________________________________ La palabra imposible solo figura en el diccionario de los tontos Post by Desarrollos A.M. Usando Visual Fox 8 con dbf nativos , al usar el select sql , hay manera de lograr ver el avance de la consulta por medio de una barra de progreso ??? Gracias por su atencion LUIS

Desarrollos A.M. hace 5 aos


Que Grande LUIS MARIA !!!! De un solo saque ayudaste a dos colegas!!!! Muchas Gracias ! LUIS
Post by Luis Mara Guayn Un lugar puede ser tu archivo de procedimientos, donde en tu PRG principal este la lnea SET PROCEDURE MiArchivoProcedimientos.PRG ADDITIVE -Luis Mara Guayn Tucumn, Argentina ________________________________ SysOp de www.PortalFox.com Microsoft Visual FoxPro MVP ________________________________ La palabra imposible solo figura en el diccionario de los tontos Post by Daniel Flores Hola Luis, Gracias por responder. Yo entre a esta pagina y me copie el codigo de la misma, pero no se donde tengo que poner la definicion de clase. Me podes explicar como se implemente este codigo?? Gracias Daniel Flores Post by Luis Mara Guayn -- Mostrar el porcentaje de ejecucin de un comando SELECT o USE VIEW -http://www.portalfox.com/index.php?name=News&file=article&sid=46 -Luis Mara Guayn

Tucumn, Argentina ________________________________ SysOp de www.PortalFox.com Microsoft Visual FoxPro MVP ________________________________ La palabra imposible solo figura en el diccionario de los tontos Post by Desarrollos A.M. Usando Visual Fox 8 con dbf nativos , al usar el select sql , hay manera de lograr ver el avance de la consulta por medio de una barra de progreso ??? Gracias por su atencion LUIS

Foros del Web

Programacin web ASPX (.net)

Implementar una barra de progreso cuando cargan datos de la base de datos


Estas en el tema de Implementar una barra de progreso cuando cargan datos de la base de datos en el foro de ASPX (.net) en Foros del Web. Hola gente El tema es asi: Tengo muchas consultas SQL que

va avanzando, se va ejecutando es decir, progresa Quiero que ese progreso se vea ...
#1 (permalink) 25/05/2009, 19:13

Fecha de Ingreso: abril-2006 Ubicacin: Santiago ,Chile

sabao

Mensajes: 169 Antigedad: 7 aos, 9 meses Puntos: 0

Implementar una barra de progreso cuando cargan datos de la base de datos

Hola gente

El tema es asi: Tengo muchas consultas SQL que va avanzando, se va ejecutando es decir, progresa Quiero que ese progreso se vea en una barra, porque como hay un par de consultas que toman bastante (baaaaaaasssssssssssttaaaaaaaaaannnnnnnnnteeeeeeee , para marcar el punto) estaria bueno que diga cuanto va, y lo mas importante, cuanto falta. Alguien tiene idea de como puedo hacer esto? Por si importa aclaro que el motor SQL es un SQL Server 2005

Saludos
Avisos Google

Limitar Login Simultaneos


en la red Windows con UserLock Descarga gratis - versin de pruebawww.isdecisions.com/userlock
ltima edicin por sabao; 25/05/2009 a las 19:19
#2 (permalink) 25/05/2009, 19:27

Fecha de Ingreso: julio-2007 Ubicacin: Montevideo (Uruguay)

mdavila

Mensajes: 918 Antigedad: 6 aos, 5 meses Puntos: 13

Respuesta: Implementar una barra de progreso cuando cargan datos de la base de datos

Bueno nunca se me ocurrio hacer eso y me dejas con la intriga de si se puede tambien.... Voy a buscar info...

Esa imagen que tenes de "cargando" se puede implementar facilmente con ajax en un progress, pero una barra que sea fiel al progreso mmmm..... Algun guru por ahi :) ? Veremos.
Avisos Google

Download Free Software


Download Free PC Manager Software for Android. Download Now ! mobogenie.com/download-software
__________________ Marcelo Davila. :. En Ignorante te conviertes al no preguntar, el que pregunta se nutre... :.

#3 (permalink) 25/05/2009, 20:04

Fecha de Ingreso: abril-2006 Ubicacin: Santiago ,Chile

sabao

Mensajes: 169 Antigedad: 7 aos, 9 meses Puntos: 0

Respuesta: Implementar una barra de progreso cuando cargan datos de la base de datos

Cita:

Iniciado por mdavila Bueno nunca se me ocurrio hacer eso y me dejas con la intriga de si se puede tambien.... Voy a buscar info... Esa imagen que tenes de "cargando" se puede implementar facilmente con ajax en un progress, pero una barra que sea fiel al progreso mmmm..... Algun guru por ahi :) ?

Veremos. hola sip es facil cuando tu puedes parar el tiempo con la herramienta update panel pero con sincronizacion con una consulta sql , seria muy bueno saberlo , saludos
#4 (permalink) 26/05/2009, 01:51

Fecha de Ingreso: enero-2008 Mensajes: 268

javi_cassi

Antigedad: 6 aos Puntos: 11

Respuesta: Implementar una barra de progreso cuando cargan datos de la base de datos

Hola muchachos, os cuento un poco lo que s y lo que me sucde a mi. Yo, dependiendo de lo que haga, trato este tema de dos formas (os pongo 3 porque una de ella no funciona, aunque seria la mas logica) - Primera. En su momento se me ocurri que lo ms sencillo sera poner un gif animado que sea una barra de tiempo, de manera que mientras se ejecuta la consulta y dems procesos, muestro el gif. Por supuesto esto no funciona, ya que el gif comienza a moverse, pero en el momento es que el ordenador commienza sus gestiones y se pone a pensar, el gif se para y deja de moverse. Por lo tanto esta observacion se descarta. - Segunda: (es la cutre pero mas sencilla) Te creas una toolbar, y la vas cargando a mano, poco a poco entre procesos y proceso. De manera qeu al empezar le pones a mano a la barra qeu este en estado 2 (de 10), al ejecutarse el primer proceso, que pase al estado 4, al ejecutarse el tercero, que pase al 8 y despues que se desvisualice. Fcil sencillo y cutre. - Tercera. (es la mejor, pero conlleva sus pormenores) Esta opcion consiste en usar el objeto BACKGROUNDWORKER Este objeto lo qeu hace es que te ejcuta los procedimientos qeu tu quieras en segundo plano. Qu quiere decir esto, qeu mientras que el procedimiento est ejecutandose, tu puedes hacer otras cosas. Tanto es as, que mientras el proceso se ejecuta tu puedes segui jugando con el panelito que te has creado dandole alos botnoes, etc etc etc. PEGAS: Para mi tiene dos: La primera, como os comentaba antes, mientras que el proceso se ejcuta el usuario puede seguir trasteando 8con el consiguiente peligro que puede tener eso de cruce d eprocesos, eventos, et etc etc) Por lo tanto, siempre que uso este objeto, deshabilito todos aquellos botoes, o eventos que el usuario pueda ejecutar que me puedan causar problemas. Termando el proceso, los vuelvo a

ejecutar. Y segundo: Puesto que el proceso se hace en segundo plano, dentro de l no puedes llamar a ningn elemento del panel en el que estas, es decri, si quieres capturar el texto del formulario (dentro del proceso, se entiende), no puede llamarlo tal cual, si no que al declarar el proceso, has depasarle sicho valor en una variable. NOTA: esto vale para barras de progeso continuas y no para las progresivas. Espero que os haya quedado un poquito claro. Os adjunto ademas un trozo de codigo para qeu os imagineis como es:

Cita:

'este es el codigo qeu pongo en el boton que ejecuta la consulta proceso_seg_plano_insertar_datos_hist()

' como os decia, en esta funcion asigno los valores de mis panel a variables, para poder usarlos despues en el objeto backgroundworker Public Sub proceso_seg_plano_insertar_datos_hist() '*** VER BACKGROUNDWORKER1 *** habilitar_deshabilitar_campos(False) Me.btt_salir.Enabled = False 'Aqui es dodne muestro la barra de proceso. uso la qeu es como el coche fantastico. Me.ProgressBar1.Visible = True 'metemos en variables los datos del panel. hacemos esto porque una vez iniciado el proceso no se podran usar v_fechaini = Me.txt_desde.Text v_preciosob = Me.txt_diassob.Text Me.DataGridView1.Enabled = False ' Comenzar trabajo en segundo plano Me.BackgroundWorker1.RunWorkerAsync() ' Esperar a que acabe el proceso en segundo plano While Me.BackgroundWorker1.IsBusy ' Mantiene funcionando los dems procesos para que el formulario siga respondiendo Application.DoEvents() End While Me.ProgressBar1.Visible = False habilitar_deshabilitar_campos(True) Genera_Mensaje(1, "Insercin realizada. Se han producido " & errores_carga_datos & " errores durante la carga de datos") gestion_boton_errores() Me.btt_salir.Enabled = True Me.DataGridView1.Enabled = True

End Sub

'Y este es el codigo del procedimiento del backgrounworker Private Sub BackgroundWorker1_DoWork(ByVal sender As System.Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker1.DoWork ' IMPORTANTE : No acceder al objeto situado en el formulario directamente ' en su lugar utilizar la referencia que llega desde el parmetro sender ' Coje el BackGroundWorker que ha iniciado este evento (sender) Dim bw As BackgroundWorker = CType(sender, BackgroundWorker) ' Comenzar operaciones deseadas en segundo plano insertar_datos_historial() If bw.CancellationPending Then e.Cancel = True End If End Sub

Pues eso es todo. Menuda clarla que os he dado. Espero haya servido de ayuda. Si quereis saber mas sobre el BACKGROUNDWORKER, ya sabeis a buscar un poquito por el google!!!!! Buen dia.

Inicio > Tecnologa e Internet > Bases de datos > Lenguaje SQL

Progress Bar
Respuesta de juanky74 a roal 12/05/2004 Usuario

Hola disculpa la molestia, tengo un formulario en donde realizo una consulta, mientras encuentra el dato buscado, deseo una barra de progreso para mostrar el avance de la bsqueda, lo que no se es como realizarlo, no tengo la ms mnima idea, no se si me puedas enviar un ejemplo explicado que realiza cada instruccin, para as tener una idea, para casos posteriores, estoy iniciando en vb6 y no comprendo mucho que realiza tal o cual instruccin.
Anuncios Google

Download Free Software


Download Free PC Manager Software

for Android. Download Now ! mobogenie.com/download-software

Experto
Hola, Te envo un ejemplo de barra de progreso, esto no esta ligado a algo solo esta en un botn donde una barra de progreso avanza cuando le das click en el botn, ok?. Private Sub Command1_Click() Dim i As Integer ProgressBar1.Min = 0 ProgressBar1.Max = 10000 For i = 0 To 10000 ProgressBar1.Value = i Next ProgressBar1.Value = 10000 'Con la finalidad de asegurarte End Sub Ahora si deseas hacerlo cuando cargas un recordset, seria de la siguiente manera ok?? Dim lrs As ADODB.Recordset ProgressBar1.Min = 1 ProgressBar1.Max = lrs.RecordCount For i = 1 To lrs.RecordCount ProgressBar1.Value = i Next Se supone que el recordset debe de estar cargado con datos ok?

Espero que esto te ayude sino mandame ms informacin para que te pueda ayudar ms Chiauu

Experto
Si esto es todo por favor finaliza la pr

Comunidad de Visual Foxpro en Espaol

Barra de progreso en VFP puro


6 entradas de 3 autores

cristian topp 23/04/13


Hola estimados se agradece una barra de progreso para visualizar mientras proceso registros de una tabla... de antemano muchas gracias

Finalizado

Guillermo MDQ 23/04/13


Bajate esta que funciona muy bien y viene con un ejemplo de uso: http://www.portalfox.com/modules.php?op=modload&name=Sections&file=index&req=viewarticle&a rtid=96 Saludos Guillermo

El martes, 23 de abril de 2013 19:12:18 UTC-3, cristian topp escribi:


- mostrar texto citado -

Marcado como finalizado porcristian topp


Ver esta respuesta en su ubicacin original

Todas las respuestas

Guillermo MDQ 23/04/13

http://www.portalfox.com/index.php?name=News&file=article&sid=2066&mode=nested&order=0&th old=0 Saludos Guillermo

El martes, 23 de abril de 2013 18:57:00 UTC-3, cristian topp escribi:


- mostrar texto citado -

cristian topp 23/04/13


Gracias Guillermo. efectivamente encontr este cdigo *-- Ejemplo lo = CREATEOBJECT("ProgressBar", "Barra de progreso 100% VFP...") lo.SHOW(2) *-- Simulo un proceso FOR ln = 1 TO 100 lo.Actualizar(ln) INKEY(.05) ENDFOR MESSAGEBOX("Proceso terminado",64) lo = .NULL. *-------------------------------------* Definicin de la clase barra de progreso *-------------------------------------DEFINE CLASS ProgressBar AS FORM DOCREATE = .T. HEIGHT = 72 WIDTH = 375 BORDERSTYLE = 2 TITLEBAR = 0 WINDOWTYPE = 0 AUTOCENTER = .T. NAME = "ProgressBar" AnchoAux = 0 *-PROCEDURE INIT

LPARAMETERS tcTitulo SYS(2002) THIS.CrearObjetos(tcTitulo) THIS.AnchoAux = THIS.CNT.CNT.WIDTH THIS.Actualizar(0) ENDPROC *-PROCEDURE DESTROY SYS(2002,1) ENDPROC *-PROCEDURE actualizar LPARAMETERS tnPorc tnPorc = MAX(MIN(tnPorc,100),0) THIS.CNT.CNT.WIDTH = THIS.AnchoAux * tnPorc /100 STORE TRANSFORM(tnPorc,"999")+"%" TO ; THIS.CNT.lbl.CAPTION, ; THIS.CNT.CNT.lbl.CAPTION THIS.DRAW ENDPROC *-PROCEDURE CrearObjetos LPARAMETERS tcTitulo THIS.ADDOBJECT("lblTitulo","label") WITH THIS.lblTitulo .FONTBOLD = .T. .ALIGNMENT = 2 .CAPTION = IIF(EMPTY(tcTitulo),; "En progreso ...",tcTitulo) .LEFT = 0 .TOP = 10 .WIDTH = 375 .VISIBLE = .T. ENDWITH THIS.ADDOBJECT("cnt","container") WITH THIS.CNT .TOP = 36 .LEFT = 9 .WIDTH = 360 .HEIGHT = 26 .SPECIALEFFECT = 1 .BACKCOLOR = RGB(255,255,255) .VISIBLE = .T. .ADDOBJECT("lbl","label") WITH .lbl .FONTBOLD = .T. .ALIGNMENT = 2 .BACKSTYLE = 0 .CAPTION = "100%" .HEIGHT = 20 .LEFT = 0 .TOP = 6 .WIDTH = 360 .VISIBLE = .T. ENDWITH .ADDOBJECT("cnt","container")

WITH .CNT .TOP = 2 .LEFT = 2 .WIDTH = 356 .HEIGHT = 22 .BORDERWIDTH = 0 .BACKCOLOR = RGB(0,0,255) .ADDOBJECT("lbl","label") .VISIBLE = .T. WITH .lbl .FONTBOLD = .T. .ALIGNMENT = 2 .BACKSTYLE = 0 .CAPTION = "100%" .HEIGHT = 20 .LEFT = 0 .TOP = 4 .WIDTH = 356 .FORECOLOR = RGB(255,255,255) .VISIBLE = .T. ENDWITH ENDWITH ENDWITH ENDPROC ENDDEFINE *--------------------------------------

pero no se utilizarlo... si me dieras algunas indicaciones sera fantstico

Guillermo MDQ 23/04/13


Bajate esta que funciona muy bien y viene con un ejemplo de uso: http://www.portalfox.com/modules.php?op=modload&name=Sections&file=index&req=viewarticle&a rtid=96 Saludos Guillermo

El martes, 23 de abril de 2013 19:12:18 UTC-3, cristian topp escribi:


- mostrar texto citado -

Marcado como finalizado porcristian topp

cristian topp 23/04/13


Para los que les sirva me funcion de la siguien te manera 1.- grabar la clase en un prg que puede lamarse progressbar 2.- en el init del formulario de proceso poner set procedure to locfile("progressbar.prg") additive 3.- en el boton de ejecutar poner para crear el objeto mas lo.show(2) 4.- en el boton de proceso poner &&tcan=cantidad de registros tcan=reccount() ln=ln+1 mpor=ROUND(ln*100/tcan,0) lo.Actualizar(MPOR) 5.- al finalizar del proceso poner lo = .NULL. MESSAGEBOX("Proceso terminado",64)

saludos

Rafael Alvarez 25/09/13


Buenas, solo funciona con orientacin Horizontal ? no funciona con orientacin Vertical? Saludos Rafael

Enviado por Luis Mara Guayn en Mircoles, 08 Marzo, 2000

Una barra de progreso en la barra de estado (StatusBar).

*---------------------------------------* EJEMPLO DE USO *---------------------------------------LOCAL loBar, lnI loBar = CREATEOBJECT("ProgressBarInStatusBar") FOR lnI = 1 TO 100 loBar.Grafica(lnI) INKEY(.01) ENDFOR RELEASE loBar *---------------------------------------* Comienzo la definicin de la calse *---------------------------------------DEFINE CLASS ProgressBarInStatusBar AS CUSTOM PROTECTED lcSetStatusBar lcSetStatusBar="" Name = "ProgressBarInStatusBar" PROCEDURE INIT THIS.lcSetStatusBar = SET("STATUS BAR") SET STATUS BAR ON SET MESSAGE TO RETURN "" ENDPROC PROCEDURE DESTROY LOCAL lcStatusBar lcStatusBar = THIS.lcSetStatusBar SET MESSAGE TO SET STATUS BAR &lcStatusBar RETURN "" ENDPROC PROCEDURE Grafica(lnPorcentaje) IF EMPTY(lnPorcentaje) lnPorcentaje = 0 ENDIF IF lnPorcentaje > 100 lnPorcentaje = 100 ENDIF SET MESSAGE TO REPLICATE("|", 160*lnPorcentaje/100) ; + STR(INT(lnPorcentaje),4) + "%" RETURN "" ENDPROC ENDDEFINE
Barra de progreso en la barra de estado (StatusBar) | Entrar/Crear una cuenta | 1 Comentario
Barra de progreso 100% VFP
Enviado por Luis Mara Guayn en Lunes, 18 Agosto, 2003

lecturas 15609

Una fcil manera de hacer una barra de progreso con cdigo puro de Visual FoxPro.

Barra de progreso 100% VFP

Por Luis Mara Guayn, Tucumn, Argentina

Esta es la definicin de la clase ProgressBar y un simple ejemplo de como utilizarla. Una vez creado el objeto, debemos llamar al mtodo Actualizar() con el procentaje de ejecucin del proceso. [0..100]

*-- Ejemplo lo = CREATEOBJECT("ProgressBar", "Barra de progreso 100% VFP...") lo.SHOW(2) *-- Simulo un proceso FOR ln = 1 TO 100 lo.Actualizar(ln) INKEY(.05) ENDFOR MESSAGEBOX("Proceso terminado",64) lo = .NULL. *-------------------------------------* Definicin de la clase barra de progreso *-------------------------------------DEFINE CLASS ProgressBar AS FORM DOCREATE = .T. HEIGHT = 72 WIDTH = 375 BORDERSTYLE = 2 TITLEBAR = 0 WINDOWTYPE = 0 AUTOCENTER = .T. NAME = "ProgressBar" AnchoAux = 0 *-PROCEDURE INIT LPARAMETERS tcTitulo SYS(2002) THIS.CrearObjetos(tcTitulo) THIS.AnchoAux = THIS.CNT.CNT.WIDTH THIS.Actualizar(0) ENDPROC *-PROCEDURE DESTROY SYS(2002,1) ENDPROC *-PROCEDURE actualizar LPARAMETERS tnPorc

tnPorc = MAX(MIN(tnPorc,100),0) THIS.CNT.CNT.WIDTH = THIS.AnchoAux * tnPorc /100 STORE TRANSFORM(tnPorc,"999")+"%" TO ; THIS.CNT.lbl.CAPTION, ; THIS.CNT.CNT.lbl.CAPTION THIS.DRAW ENDPROC *-PROCEDURE CrearObjetos LPARAMETERS tcTitulo THIS.ADDOBJECT("lblTitulo","label") WITH THIS.lblTitulo .FONTBOLD = .T. .ALIGNMENT = 2 .CAPTION = IIF(EMPTY(tcTitulo),; "En progreso ...",tcTitulo) .LEFT = 0 .TOP = 10 .WIDTH = 375 .VISIBLE = .T. ENDWITH THIS.ADDOBJECT("cnt","container") WITH THIS.CNT .TOP = 36 .LEFT = 9 .WIDTH = 360 .HEIGHT = 26 .SPECIALEFFECT = 1 .BACKCOLOR = RGB(255,255,255) .VISIBLE = .T. .ADDOBJECT("lbl","label") WITH .lbl .FONTBOLD = .T. .ALIGNMENT = 2 .BACKSTYLE = 0 .CAPTION = "100%" .HEIGHT = 20 .LEFT = 0 .TOP = 6 .WIDTH = 360 .VISIBLE = .T. ENDWITH .ADDOBJECT("cnt","container") WITH .CNT .TOP = 2 .LEFT = 2 .WIDTH = 356 .HEIGHT = 22 .BORDERWIDTH = 0 .BACKCOLOR = RGB(0,0,255) .ADDOBJECT("lbl","label") .VISIBLE = .T. WITH .lbl .FONTBOLD = .T. .ALIGNMENT = 2 .BACKSTYLE = 0

.CAPTION = "100%" .HEIGHT = 20 .LEFT = 0 .TOP = 4 .WIDTH = 356 .FORECOLOR = RGB(255,255,255) .VISIBLE = .T. ENDWITH ENDWITH ENDWITH ENDPROC ENDDEFINE *-------------------------------------Luis Mara Guayn
Barra de progreso en degrad de colores
Enviado por darkfox en Jueves, 22 Enero, 2004

lecturas 14208

Esta clase es un barra de progreso de un proceso determinado. La diferecia con el resto de las barras ya concidas es que en esta le puedes elegir el color con el que quieras que comience y con el que quieras que finalize, formdose en el medio un degrad entre esos dos colores.

***Barra de progreso en degrad de colores ***Autor: Gabriel Mandelli ***ID. DARKFOX * Primero creamos un formulario PUBLIC oform oform=CREATEOBJECT("MyForm") oform.WINDOWSTATE=0 oform.HEIGHT=39 oform.LEFT=0 oform.TOP=0 oform.WIDTH=406 * Agregamos los distintos objetos que forman el termmetro * Est formado por dos contenedores: C0 y C1 * En el container C1 se agregan dos lneas y 200 shapes * que son los que se irn pintando con los colores en * degrad a medida que progresa el proceso determinado * En el container C0 se agrega un texbox con el ttulo oform.termometro.c1.ADDOBJECT('Linea1','shape') WITH oform.termometro.c1.linea1 .BACKSTYLE=0 .BACKCOLOR=RGB(88,112,156) .HEIGHT=2 .LEFT=0 .SPECIALEFFECT=0 .TOP=0 .WIDTH=402 .VISIBLE=.T. ENDWITH oform.termometro.c1.ADDOBJECT('Linea2','shape') WITH oform.termometro.c1.linea2 .BACKSTYLE=0 .BACKCOLOR=RGB(88,112,156) .HEIGHT=2

.LEFT=0 .SPECIALEFFECT=0 .TOP=18 .WIDTH=402 .VISIBLE=.T. ENDWITH FOR I=1 TO 200 figura='Shape'+ALLTRIM(STR(I)) oform.termometro.c1.ADDOBJECT(figura,'shape') figura1='oform.termometro.c1.'+figura WITH &figura1. .BORDERCOLOR=RGB(88,112,156) .BACKCOLOR=RGB(88,112,156) .FILLSTYLE=0 .FILLCOLOR=RGB(0,255,0) .TOP=2 .HEIGHT=15 .WIDTH=2 .LEFT=(I*2)-1 .CURVATURE=0 .VISIBLE=.F. ENDWITH ENDFOR WITH oform.termometro.c0 .ADDOBJECT('label1','label') .label1.CAPTION='Titulo' .label1.BORDERSTYLE=0 .label1.BACKSTYLE=0 .label1.FONTBOLD=.T. .label1.FORECOLOR=RGB(255,255,255) .label1.TOP=2 .label1.HEIGHT=16 .label1.WIDTH=300 .label1.LEFT=2 .label1.VISIBLE=.T. ENDWITH * Se muestra el formulario con el termmetro oform.SHOW() * Se llama al procedimiento iniciar que efecta los clculos * necesarios para seleccionar los colores correspondientes a * cada shape del termmetro DO iniciar RETURN ***** PROCEDURE iniciar * Se eligen los colores de inicio y final * Si se quiere colores predeterminados sacar los GETCOLOR y * poner el valor RGB() deseado c1=GETCOLOR() c2=GETCOLOR() a1=INT(c1/(256*256)) v1=INT(MOD(c1,256*256)/256) r1=INT(MOD(MOD(c1,256*256),256)) a2=INT(c2/(256*256)) v2=INT(MOD(c2,256*256)/256) r2=INT(MOD(MOD(c2,256*256),256))

entero = 0 reg = 200 titulo = 'PROCESANDO...' &&Ttulo que desea colocarle a la barra oform.termometro.configuracion FOR ctr = 1 TO 200 oform.termometro.barra ***** * Procesos que se realiza * reemplazar el INKEY por el proceso INKEY(.01) ***** ENDFOR MESSAGEBOX("Final",64) oform.termometro.borrar oform.RELEASE ENDPROC ************ DEFINE CLASS MyForm AS FORM CAPTION="Termmetro" BORDERSTYLE=3 AUTOCENTER=.T. HEIGHT=39 LEFT=0 TOP=0 WIDTH=406 ADD OBJECT termometro AS termo ENDDEFINE DEFINE CLASS termo AS CONTAINER HEIGHT=44 WIDTH=408 SPECIALEFFECT=1 BACKSTYLE=0 ADD OBJECT c1 AS CONTAINER WITH; LEFT=1,; HEIGHT=20,; TOP=20,; WIDTH=403,; BACKCOLOR=RGB(0,128,192),; BACKSTYLE=1,; BORDERCOLOR=RGB(0,128,192) ADD OBJECT c0 AS CONTAINER WITH; LEFT=1,; HEIGHT=20,; TOP=0,; WIDTH=403,; BACKCOLOR=RGB(0,128,192),; BACKSTYLE=1,; BORDERCOLOR=RGB(0,128,192) PROCEDURE INIT PUBLIC titulo,r1,v1,a1,r2,v2,a2,ctr,reg,entero,porcentaje entero=0 porcentaje=0 ENDPROC PROCEDURE barra porcentaje = ctr / reg * 200 entero=INT(porcentaje)

IF entero>=1 figura='this.c1.shape'+ALLTRIM(STR(entero,3))+'.visible' IF &figura=.F. rojo = r1 + entero * (r2-r1) / 200 verde = v1 + entero * (v2-v1) / 200 azul = a1 + entero * (a2-a1) / 200 bordes='this.c1.shape'+ALLTRIM(STR(entero,3))+'.bordercolor' &bordes=RGB(rojo,verde,azul) &figura=.T. ENDIF ENDIF ENDPROC PROCEDURE borrar IF entero#0 figura='this.c1.shape'+ALLTRIM(STR(entero,3))+'.visible' &figura=.T. ENDIF FOR I=1 TO 100 figura='this.c1.shape'+ALLTRIM(STR(I,3))+'.visible' &figura=.F. ENDFOR oFORM.termometro.VISIBLE=.F. ENDPROC PROCEDURE configuracion THIS.VISIBLE=.T. oform.termometro.c0.label1.CAPTION=titulo ENDPROC ENDDEFINE
Medidor (gauge) 100% en VFP 9.0
Enviado por Luis Mara Guayn en Lunes, 15 Agosto, 2005

lecturas 8849

Clase con un medidor circular (gauge) que grafica el porcentaje de un procedimiento con un objeto Shape y la nueva propiedad PolyPoint de Visual FoxPro 9.0.

Medidor 100% en VFP 9.0

Por Luis Mara Guayn, Tucumn, Argentina

El siguiente es el cdigo 100% VFP9 para graficar un medidor circular. En el ejemplo se utiliza la imagen "lmGauge.gif" como fondo del medidor. Puede descargar la imagen, la clase y un formulario de ejemplo haciendo clic en el siguiente enlace: lmGauge.zip (14,9 KB) Imagen del formulario de ejemplo conteniendo la clase lmGauge

PUBLIC goMiForm goMiForm = CREATEOBJECT("MiForm") goMiForm.SHOW(1) RETURN DEFINE CLASS MiForm AS FORM HEIGHT = 250 WIDTH = 350 AUTOCENTER = .T. CAPTION = "Gauge" NAME = "MiForm" ADD OBJECT Gauge1 AS lmGauge WITH ; TOP = 8, ; LEFT = 16, ; WIDTH = 220, ; NAME = "Gauge1" ADD OBJECT cmdGraficar AS COMMANDBUTTON WITH ; TOP = 8, ; LEFT = 248, ; HEIGHT = 32, ; WIDTH = 84, ; CAPTION = "Graficar", ; NAME = "cmdGraficar" ADD OBJECT cmdColor AS COMMANDBUTTON WITH ; TOP = 48, ; LEFT = 248, ; HEIGHT = 32, ; WIDTH = 84, ; CAPTION = "Color", ; NAME = "cmdColor" PROCEDURE cmdGraficar.CLICK LOCAL ln THISFORM.SETALL("Enabled",.F.,"CommandButton") *-- Simulo un proceso del 0 al 100% FOR ln = 0 TO 100 THISFORM.Gauge1.Grafica(ln) INKEY(.001,"MH") ENDFOR THISFORM.SETALL("Enabled",.T.,"CommandButton") ENDPROC

PROCEDURE cmdColor.CLICK THISFORM.Gauge1.shpGauge.BACKCOLOR = ; GETCOLOR(THISFORM.Gauge1.shpGauge.BACKCOLOR) ENDPROC ENDDEFINE DEFINE CLASS lmGauge AS CONTAINER WIDTH = 220 HEIGHT = 220 BACKSTYLE = 0 BORDERWIDTH = 0 NAME = "lmGauge" ADD OBJECT shpGauge AS SHAPE WITH ; TOP = 0, ; LEFT = 0, ; HEIGHT = 220, ; WIDTH = 220, ; BORDERWIDTH = 1, ; BACKCOLOR = RGB(255,255,255), ; POLYPOINTS = "This.aPoly", ; NAME = "shpGauge" ADD OBJECT lblGauge AS LABEL WITH ; AUTOSIZE = .T., ; FONTBOLD = .T., ; FONTNAME = "Arial", ; FONTSIZE = 9, ; ALIGNMENT = 2, ; BACKSTYLE = 0, ; CAPTION = "100%", ; HEIGHT = 20, ; LEFT = 90, ; TOP = 140, ; WIDTH = 32, ; NAME = "lblGauge" *-- debe existir el archivo grafico "lmGauge.gif" ADD OBJECT imgGauge AS IMAGE WITH ; PICTURE = "lmGauge.gif", ; STRETCH = 2, ; BACKSTYLE = 0, ; HEIGHT = 220, ; LEFT = 0, ; TOP = 0, ; WIDTH = 220, ; NAME = "imgGauge", ; VISIBLE = FILE("lmGauge.gif") PROCEDURE Grafica LPARAMETERS tnGauge LOCAL lnGauge, lnAng, lnCos, lnSen lnAng = 0 lnCos = COS(DTOR(lnAng + 135)) lnSen = SIN(DTOR(lnAng + 135)) THIS.shpGauge.aPoly(2,1) = 50 * lnCos + 50 THIS.shpGauge.aPoly(2,2) = 50 * lnSen + 50 lnGauge = MAX(0,MIN(tnGauge,100)) * 0.1 FOR lnI = 3 TO 30 lnAng = (lnGauge) * (lnI - 3)

lnCos = COS(DTOR(lnAng + 135)) lnSen = SIN(DTOR(lnAng + 135)) THIS.shpGauge.aPoly(lnI,1) = 50 * lnCos + 50 THIS.shpGauge.aPoly(lnI,2) = 50 * lnSen + 50 ENDFOR THIS.lblGauge.CAPTION = TRANSFORM(tnGauge,"999%") THIS.shpGauge.REFRESH ENDPROC PROCEDURE INIT THIS.Grafica(0) ENDPROC PROCEDURE shpGauge.INIT LOCAL lnI THIS.HEIGHT = THIS.PARENT.HEIGHT THIS.WIDTH = THIS.PARENT.WIDTH THIS.ADDPROPERTY("aPoly[30,2]") FOR lnI = 1 TO 30 STORE 50 TO ; THIS.aPoly[lnI,1], ; THIS.aPoly[lnI,2] ENDFOR ENDPROC PROCEDURE lblGauge.INIT THIS.TOP = THIS.PARENT.HEIGHT * .75 THIS.LEFT = (THIS.PARENT.WIDTH / 2) - (THIS.WIDTH / 2) ENDPROC PROCEDURE imgGauge.INIT THIS.HEIGHT = THIS.PARENT.HEIGHT THIS.WIDTH = THIS.PARENT.WIDTH THIS.STRETCH = 2 ENDPROC ENDDEFINE

Mostrar barra de Progreso en un Select SQL


Visual Fox Pro, TrucosAgregar Comentarios

A muchos les gustara mostrar una barra de progreso en sus consultas Select SQL; no es muy bueno hacerlo puesto que al estar activo el Set Talk las consultas tardara mucho ms; pero si an as quieres utilizarla.... Para poder ver la barra la tabla debe tener bastantes registros....

Define Window WinSQL From 12,30 To 16,70; SHADOW Color Scheme5 Double Name loWind Active Window WinSQL Noshow Set Talk Window WinSQL Set Talk On Set Notify On Select * From Tabla

Release Window WinSQL

FoxPro/Visual FoxPro Avanzado - BARRA DE PROGRESO EN CONSULTA SQL


Buscar

Volver

Agregar Nota <<>>

Vista:

arbol

BARRA DE PROGRESO EN CONSULTA SQL

Juan Carlos Garzona (05/09/2002 19:27:52)3.594 visitas 1 respuesta

RE:BARRA DE PROGRESO EN CONSULTA SQL alberto (06/09/2002 08:33:33)

As un to:

BARR A DE PROG RESO EN CONS ULTA SQL Juan Carlos Garzo na (3 interv encio nes) 05/09 /2002 19:27: 52

0
Au tor :

Fe ch a: HOLA AMIGOS Y GRACIAS POR SU TIEMPO

DESEO SABER COMO CREAR UNA BARRA DE PROGRESO MIENTRAS SE EJECUTA UNA SENTECIA DE SQL .. EJEMPLO: SELECT CNOMBRE FROM CREDKAR WHERE CCODUSU = LCCODUSU INTO TABLE MYPRUEBA ESTA BASE MANEJA GRAN CANTIDAD DE REGISTROS Y MIENTRAS SE EJECUTA EL SELECT QUE ME MUESTRE UNA BARRA DE PREGRESO DE LA CONSULTA.. MUCHAS GRACIAS SALU2 DESDE EL SALVADOR

Responder

As un to:

RE:BA RRA DE PROG RESO EN CONS ULTA SQL albert o (20 interv encio nes) 06/09 /2002 08:33: 33

Au tor :

Fe ch a: la manera mas facil y rapida es que actives set talk antes de ejectar el select set talk on select ....... set talk off con eso se activa la barra de progreso interna de visual fox

FoxPro/Visual FoxPro - Barra de progreso para un update


Buscar

Volver

Agregar Nota <<>>

Vista:

arbol

Barra de progreso para un update es_binario (29/04/2011 15:44:35)1.332 visitas 3 respuestas

Barra de progreso para un update Victor Perez (29/04/2011 22:54:25)

Barra de progreso para un update Juan Manuel Cruz (03/05/2011 11:13:56)

Barra de progreso para un update es_binario (30/04/2011 05:02:06)

As un to:

0
Au tor :

Barra de progre so para un updat e es_bin ario (7 37 interv encio nes) 29/04 /2011 15:44: 35

Fe ch a:

Siempre he tenido esta duda, he usado muchas clases de barras de progreso con ciertas propiedades pero no he podido encontrar la forma de usarla en un proceso en el que yo desconozca el final del mismo. por ejemplo yo uso una barra en la que con un simple regla de 3 se el tama;o de la barra sabiendo el numero de registros que va a recorrer y funciona muy bien. *//------------------------------------------------BARRA BARRA BARRA BARRA BARRA BARRA BARRA BARRA total_de_registros = Reccount() *// Barran 2 Thisformset.form1.barraProg.max = 100 *//------------------------------------------------BARRA BARRA BARRA BARRA BARRA BARRA BARRA BARRA porcentaje_actual = INT((ve/total_de_registros)*100) IF porcentaje_actual != porcentaje_viejo Thisformset.form1.barraProg.value = porcentaje_actual porcentaje_viejo = porcentaje_actual ENDIF

pero no puedo hacer lo mismo con una sentencia update con una barra de progreso alguien a hecho esto

antes y si lo han hecho me pueden decir como.

UPDATE articulos; SET articulos.tip_desc = "C", articulos.desc = mDescuentoCon; WHERE articulos.cve_onco = .T. AND EMPTY(code_nadro) = .F.

gracias. Responder

Otras secciones de LWP con contenido similar... - Cursos de FoxPro/Visual FoxPro - Temas de FoxPro/Visual FoxPro - Cdigo fuente de FoxPro/Visual FoxPro

As un to:

Barra de progre so para un updat e Victor Perez (237 interv encio nes) 29/04 /2011

Au tor :

Fe ch

a:

22:54: 25

Hola Es_binario, Me parece interesante la forma en que planteas tu programa para el Progreso de la Barra. Pero no entiendo de donde tomas la variable "ve" en la sentencia "porcentaje_actual = INT((ve/total_de_registros)*100)" Saludos y si me aclaras para utilizar tu subrutina. Victor - Panama Comentar

As un to:

Barra de progreso para un update Juan Manuel Cruz juanmcr uz@hotmail.c om (385 intervencione s)

0
Au tor :

Fe ch a:

03/05/2011 11:13:56

Primero, si no sabes cual es nmero de registros por adelantado, no tiene sentido que pongas una barra de progreso, en todo caso un reloj de arena, smbolo de espera, un circular como los de navegadores... Segundo: dentro de una orden VFP no te deja hacer procesos paralelos. Por si te tienta poner un gif animado, un timer, etc, VFP lo dejar de lado mientras ejecuta esa orden SQL. As que nada, yo te recomendara el reloj de arena 'de toda la vida'. Saludos.

Comentar

As un to:

0
Au tor :

Barra de progre so para un updat e es_bin ario (7 37 interv encio nes) 30/04 /2011 05:02: 06

Fe ch a: ve es el registro en el que voy con un ciclo for a algo asi select tabla_barre for a = 1 to reccount() select tabla_barre ve = a endfor

solo que no puse todo el codigo es decir que ve = ir al registro que toca y al mismo tiempo el calculo con la regla de 3 saludos.

Desarrollos A.M. hace 5 aos

Hola Grupo : Usando Visual Fox 8 con dbf nativos , al usar el select sql , hay manera de lograr ver el avance de la consulta por medio de una barra de progreso ??? Gracias por su atencion LUIS

Luis Mara Guayn hace 5 aos


Una opcin: -- Mostrar el porcentaje de ejecucin de un comando SELECT o USE VIEW -http://www.portalfox.com/index.php?name=News&file=article&sid=46 -Luis Mara Guayn Tucumn, Argentina ________________________________ SysOp de www.PortalFox.com Microsoft Visual FoxPro MVP ________________________________ La palabra imposible solo figura en el diccionario de los tontos
Post by Desarrollos A.M. Usando Visual Fox 8 con dbf nativos , al usar el select sql , hay manera de lograr ver el avance de la consulta por medio de una barra de progreso ??? Gracias por su atencion LUIS

Daniel Flores hace 5 aos


Hola Luis, Gracias por responder. Yo entre a esta pagina y me copie el codigo de la misma, pero no se donde tengo que poner la definicion de clase. Me podes explicar como se implemente este codigo?? Gracias Daniel Flores
Post by Luis Mara Guayn -- Mostrar el porcentaje de ejecucin de un comando SELECT o USE VIEW -http://www.portalfox.com/index.php?name=News&file=article&sid=46 -Luis Mara Guayn Tucumn, Argentina ________________________________ SysOp de www.PortalFox.com Microsoft Visual FoxPro MVP ________________________________ La palabra imposible solo figura en el diccionario de los tontos

Post by Desarrollos A.M. Usando Visual Fox 8 con dbf nativos , al usar el select sql , hay manera de lograr ver el avance de la consulta por medio de una barra de progreso ??? Gracias por su atencion LUIS

Luis Mara Guayn hace 5 aos


Un lugar puede ser tu archivo de procedimientos, donde en tu PRG principal este la lnea SET PROCEDURE MiArchivoProcedimientos.PRG ADDITIVE -Luis Mara Guayn Tucumn, Argentina ________________________________ SysOp de www.PortalFox.com Microsoft Visual FoxPro MVP ________________________________ La palabra imposible solo figura en el diccionario de los tontos
Post by Daniel Flores Hola Luis, Gracias por responder. Yo entre a esta pagina y me copie el codigo de la misma, pero no se donde tengo que poner la definicion de clase. Me podes explicar como se implemente este codigo?? Gracias Daniel Flores Post by Luis Mara Guayn -- Mostrar el porcentaje de ejecucin de un comando SELECT o USE VIEW -http://www.portalfox.com/index.php?name=News&file=article&sid=46 -Luis Mara Guayn Tucumn, Argentina ________________________________ SysOp de www.PortalFox.com Microsoft Visual FoxPro MVP ________________________________ La palabra imposible solo figura en el diccionario de los tontos Post by Desarrollos A.M. Usando Visual Fox 8 con dbf nativos , al usar el select sql , hay manera de lograr ver el avance de la consulta por medio de una barra de progreso ??? Gracias por su atencion LUIS

Desarrollos A.M. hace 5 aos


Que Grande LUIS MARIA !!!! De un solo saque ayudaste a dos colegas!!!! Muchas Gracias !

LUIS
Post by Luis Mara Guayn Un lugar puede ser tu archivo de procedimientos, donde en tu PRG principal este la lnea SET PROCEDURE MiArchivoProcedimientos.PRG ADDITIVE -Luis Mara Guayn Tucumn, Argentina ________________________________ SysOp de www.PortalFox.com Microsoft Visual FoxPro MVP ________________________________ La palabra imposible solo figura en el diccionario de los tontos Post by Daniel Flores Hola Luis, Gracias por responder. Yo entre a esta pagina y me copie el codigo de la misma, pero no se donde tengo que poner la definicion de clase. Me podes explicar como se implemente este codigo?? Gracias Daniel Flores Post by Luis Mara Guayn -- Mostrar el porcentaje de ejecucin de un comando SELECT o USE VIEW -http://www.portalfox.com/index.php?name=News&file=article&sid=46 -Luis Mara Guayn Tucumn, Argentina ________________________________ SysOp de www.PortalFox.com Microsoft Visual FoxPro MVP ________________________________ La palabra imposible solo figura en el diccionario de los tontos Post by Desarrollos A.M. Usando Visual Fox 8 con dbf nativos , al usar el select sql , hay manera de lograr ver el avance de la consulta por medio de una barra de progreso ??? Gracias por su atencion LUIS

LOS TRUCOS AQUI MOSTRADOS HAN SIDO RECOPILADOS DE VARIAS PAGINAS Y NO SON PROPIEDAD INTELECTUAL DEL AUTOR DE ESTE BLOG, HAN SIDO RECOPILADOS CON EL FIN DE QUE SIRVAN COMO AYUDA A MUCHOS

PROGRAMADORES.Mostrar un reporte dentro de un formularioExcelente truco con el cual podrs mostrar tu reporte en un formulario.oRep =Createobject("Form")With oRep.Caption= "Titulo del Reporte".WindowState= 2.Show()EndwithReport Form MiReporte.frx Preview Window (oRep.Name)Hacer que hable el PCExcelente truco que utiliza el objeto COM SAPI que viene con WinXP el cual "pronuncia" lo que le escribas.oVoz = CreateObject("SAPI.SpVoice")oVoz.Speak ("Visual fox Pro")oVoz.Speak("Lo mejor")Extraer informacin de los MP3Quieres conocer la informacin de los archivos MP3 ?? ... autor, titulo, lbum, ao ...lnFile = Fopen(Getfile())Fseek(lnFile, -128,2)lcTag = Fread(lnFile, 128)? "Titulo: ", Strtran(Substr(lcTag,4,30), Chr(0))? "Artista: ", Strtran(Substr(lcTag,34,30),

Chr(0))? "Album: ", Strtran(Substr(lcTag,64,30), Chr(0))? "Ao: ", Val(Substr(lcTag,94,4))Fclose(lnFile)Supri mir ventana "Imprimiendo" en VFP 8Uno de las nuevas caractersticas incorporadas en VFP 8, si deseas puedes impedirque se vea la ventana "Imprimiendo" que se muestra cuando ejecutas un reporte.Report Form NombreReporte To Printer Prompt NODIALOG PreviewNombre del dominio en que se logeo el PCp align="justify">Un pequeo truco para cuando quieras determinar en que dominio se logeo un determinado PC.? GetEnv("USERDOMAIN")Determinar si una unidad de red esta disponibleEsta es la forma ms sencilla para determinar si un equipo de la red esta encendido o si esta disponible una determinada unidad de red.Si la unidad esta disponible se devolver -1 y si la unidad no existe o esta apagado el PC entonces devolver -1?

DISKSPACE("\\NombreServidor\C\")Co mpactar base de datos de Access desde VFPMuy buen truco que permite compactar una base de datos de Access desde VFP.oJE = CreateObject("JRO.JetEngine")oJE.Com pactDatabase("Data Source=" + "d:articulos.mdb", "Data Source=" + "d:articulos1.mdb")Los parmetros para el mtodo CompacDatabase son los siguientesPrimer parmetro"Data Source=" + "ruta de la base de datos a compactar"Segundo parmetro"Data Source=" + "ruta de la nueva base de datos compactadaFoxPro/Visual FoxPro - barra de progreso en
consulta sql
Buscar

Volver

Agregar Nota <<>>

Vista:

arbol

barra de progreso en consulta sql Aldo Franco (13/06/2012 14:56:26)934 visitas 2 respuestas

barra de progreso en consulta sql Mauricio (13/06/2012 15:56:39)

barra de progreso en consulta sql Aldo Antonio (13/06/2012 16:39:39)

As un to:

barra de progre so en consul

ta sql Aldo Franc o (19 interv encio nes) 13/06 /2012 14:56: 26

Au tor :

Fe ch a:

encontre este codigo que me permite ver una barra de progreso en una consulta a la tabla de sql, tengo caso 10 millones de registro y me gustaria saber en que porciento va, pero me esta dando un error la siguiente sintaxis

Define Window WinSQL From 12,30 To 16,70; SHADOW Color Scheme5 Double Name loWind Active Window WinSQL Noshow Set Talk Window WinSQL Set Talk On Set Notify On Select * From Tabla Release Window WinSQL Responder

Otras secciones de LWP con contenido similar... - Cursos de FoxPro/Visual FoxPro - Temas de FoxPro/Visual FoxPro - Cdigo fuente de FoxPro/Visual FoxPro

0
barra de progre so en consul ta sql Mauri cio (9 42 interv encio nes) 13/06 /2012 15:56: 39

As un to:

Au tor :

Fe ch a: Corrige la palabra resaltada....: Define Window WinSQL From 12,30 To 16,70; SHADOW Color Scheme 5 Double Name loWind Activate Window WinSQL Noshow Set Talk Window WinSQL Set Talk On Set Notify On Select * From articulo Release Window WinSQL

Hola foro: tengo el siguiente SELECT: Select a.ordecodi as Codigo,ALLTRIM(b.clieapep)+' '+ALLTRIM(b.clieapem)+' '+ALLTRIM(b.clienomb) as Cliente,; c.estanomb as Estado,b.cliecodi as CodCliente,a.estacodi,emitidos.comproban from ordenes a INNER JOIN clientes b ON a.cliecodi=b.cliecodi; INNER JOIN estados c ON a.estacodi=c.estacodi ; LEFT OUTER JOIN ; (SELECT z.ordecodi,COUNT(d.ordecodi) as comproban ; FROM ordenes z INNER JOIN ordedocum d on z.ordecodi=d.ordecodi INNER JOIN ventas v ON ; d.tdoccodi+d.serie+d.numero=v.coddoc+v.serie+v.numero where v.flgborrado=.f. ; ORDER BY z.ordecodi GROUP BY z.ordecodi HAVING comproban=2) as emitidos ;

ON a.ordecodi=emitidos.ordecodi WHERE a.estacodi<>'E02' INTO CURSOR cAuxiliar READWRITE el cual me funciona ok. pero me he dado cuenta que de vez en cuando me aparece una ventanita encima de mi form con una barra de progreso que va indicando el " Avance de mi select" como les comento yo no he programado ninguna barra , pero esta aparece me parece cuando hay demasiados datos en mi tabla, el cual me parece muy bueno, pero es automatico; quisiera saber como lo puedo implementar o llamar para todas mis sentencias Select; ya que me sirve para poder representar el tiempo que me va a tomar mi sentencia al menos cuando esta muy cargada mis tablas. Esta barra automatica es nueva en VFP 9.0; por que solo la he visto en esta versin ? Como la puedo activar en todos mis select? Gracias por la ayuda. -- SAMUEL SMH -Lima Peru Jorge Mndez hace 5 aos Hola! Esa barra ha estado en todas las versiones de VFP que recuerdo. Aparece al hacer un select cuando SET TALK es ON. Un saludito! Jorge.
Post by Samuel San Miguel Hernndez Select a.ordecodi as Codigo,ALLTRIM(b.clieapep)+' '+ALLTRIM(b.clieapem)+' '+ALLTRIM(b.clienomb) as Cliente,; c.estanomb as Estado,b.cliecodi as CodCliente,a.estacodi,emitidos.comproban from ordenes a INNER JOIN clientes b ON a.cliecodi=b.cliecodi; INNER JOIN estados c ON a.estacodi=c.estacodi ; LEFT OUTER JOIN ; (SELECT z.ordecodi,COUNT(d.ordecodi) as comproban ; FROM ordenes z INNER JOIN ordedocum d on z.ordecodi=d.ordecodi INNER JOIN ventas v ON ; d.tdoccodi+d.serie+d.numero=v.coddoc+v.serie+v.numero where v.flgborrado=.f. ; ORDER BY z.ordecodi GROUP BY z.ordecodi HAVING comproban=2) as emitidos ; ON a.ordecodi=emitidos.ordecodi WHERE a.estacodi<>'E02' INTO CURSOR cAuxiliar READWRITE el cual me funciona ok. pero me he dado cuenta que de vez en cuando me aparece una ventanita encima de mi form con una barra de progreso que va indicando el " Avance de mi select" como les comento yo no he programado ninguna barra , pero esta aparece me parece cuando hay demasiados datos en mi tabla, el cual me parece muy bueno, pero es automatico; quisiera saber como lo puedo implementar o llamar para todas mis sentencias

Select; ya que me sirve para poder representar el tiempo que me va a tomar mi sentencia al menos cuando esta muy cargada mis tablas. Esta barra automatica es nueva en VFP 9.0; por que solo la he visto en esta versin ? Como la puedo activar en todos mis select? Gracias por la ayuda. -- SAMUEL SMH -Lima Peru

Samuel SMH hace 5 aos Hola Jorge, bueno probe como mencionas pero sigo sin obtener la barra de progreso... en todo caso la idea no solo es poder usarlo en select a DBF, sino tambien a Select de SQL SERVER a STORE PROCEDURE de SQL , Ya que a veces las respuestas toman mucho tiempo digamos 3 minutos, y pareciera que se a colgado el sistema pero noes asi , solo esta extrayendo los datos (Select pesados) Gracias de nuevo
Post by Jorge Mndez Hola! Esa barra ha estado en todas las versiones de VFP que recuerdo. Aparece al hacer un select cuando SET TALK es ON. Un saludito! Jorge. Post by Samuel San Miguel Hernndez Select a.ordecodi as Codigo,ALLTRIM(b.clieapep)+' '+ALLTRIM(b.clieapem)+' '+ALLTRIM(b.clienomb) as Cliente,; c.estanomb as Estado,b.cliecodi as CodCliente,a.estacodi,emitidos.comproban from ordenes a INNER JOIN clientes b ON a.cliecodi=b.cliecodi; INNER JOIN estados c ON a.estacodi=c.estacodi ; LEFT OUTER JOIN ; (SELECT z.ordecodi,COUNT(d.ordecodi) as comproban ; FROM ordenes z INNER JOIN ordedocum d on z.ordecodi=d.ordecodi INNER JOIN ventas v ON ; d.tdoccodi+d.serie+d.numero=v.coddoc+v.serie+v.numero where v.flgborrado=.f. ; ORDER BY z.ordecodi GROUP BY z.ordecodi HAVING comproban=2) as emitidos ; ON a.ordecodi=emitidos.ordecodi WHERE a.estacodi<>'E02' INTO CURSOR cAuxiliar READWRITE el cual me funciona ok. pero me he dado cuenta que de vez en cuando me aparece una ventanita encima de mi form con una barra de progreso que va indicando el " Avance de mi select" como les comento yo no he programado ninguna barra , pero esta aparece me parece cuando hay demasiados datos en mi tabla, el cual me parece muy bueno, pero es automatico; quisiera saber como lo puedo implementar o llamar para todas mis sentencias Select; ya que me sirve para poder representar el tiempo que me va a tomar mi sentencia al menos cuando esta muy cargada mis tablas. Esta barra automatica es nueva en VFP 9.0; por que solo la he visto en esta versin ? Como la puedo activar en todos mis select? Gracias por la ayuda. -- SAMUEL SMH -Lima Peru

Enrique Jaco hace 5 aos Para las de SQL yo tengo esta funcion, pero no se porque usando la barra se tarda mas que al no usarla FUNCTION Server_Select LPARAMETERS lcSelect, lcCursorName, lcDNS, lbNoConBarra LOCAL lbReturn lcDNS = Parametros.DNS lnConnP = SQLCONNECT(lcDNS, "GeoUser", "GeoUser") IF lnConnP < 0 THEN RETURN .F. ENDIF IF !lbNoConBarra THEN loTherm = NEWOBJECT("_thermometer","","","") loTherm.Show() SQLSETPROP(lnConnP,"Asynchronous",.T.) ENDIF SQLPREPARE(lnConnP, lcSelect, lcCursorName) IF !lbNoConBarra THEN lc_time = 0 DO WHILE SQLEXEC(lnConnP) = 0 lc_time=lc_time+1 loTherm.UPDATE(lc_time, "Solicitando Datos al Servidor... "+TRANS(lc_time))

ENDDO loTherm.COMPLETE() SQLSETPROP(lnConnP,"Asynchronous",.F.) ELSE WAIT WINDOW "Solicitando Datos al Servidor... " NOWAIT SQLEXEC(lnConnP) ENDIF SQLDISCONNECT(lnConnP) WAIT CLEAR RETURN .T.
Post by Samuel SMH Hola Jorge, bueno probe como mencionas pero sigo sin obtener la barra de progreso... en todo caso la idea no solo es poder usarlo en select a DBF, sino tambien a Select de SQL SERVER a STORE PROCEDURE de SQL , Ya que a veces las respuestas toman mucho tiempo digamos 3 minutos, y pareciera que se a colgado el sistema pero noes asi , solo esta extrayendo los datos (Select pesados) Gracias de nuevo Post by Jorge Mndez Hola! Esa barra ha estado en todas las versiones de VFP que recuerdo. Aparece al hacer un select cuando SET TALK es ON. Un saludito! Jorge. Post by Samuel San Miguel Hernndez Select a.ordecodi as Codigo,ALLTRIM(b.clieapep)+' '+ALLTRIM(b.clieapem)+' '+ALLTRIM(b.clienomb) as Cliente,; c.estanomb as Estado,b.cliecodi as CodCliente,a.estacodi,emitidos.comproban from ordenes a INNER JOIN clientes b ON a.cliecodi=b.cliecodi; INNER JOIN estados c ON a.estacodi=c.estacodi ; LEFT OUTER JOIN ; (SELECT z.ordecodi,COUNT(d.ordecodi) as comproban ; FROM ordenes z INNER JOIN ordedocum d on z.ordecodi=d.ordecodi INNER JOIN ventas v ON ; d.tdoccodi+d.serie+d.numero=v.coddoc+v.serie+v.numero where v.flgborrado=.f. ; ORDER BY z.ordecodi GROUP BY z.ordecodi HAVING comproban=2) as emitidos ; ON a.ordecodi=emitidos.ordecodi WHERE a.estacodi<>'E02' INTO CURSOR cAuxiliar READWRITE el cual me funciona ok. pero me he dado cuenta que de vez en cuando me aparece una ventanita encima de mi form con una barra de progreso que va indicando el " Avance de mi select" como les comento yo no he programado ninguna barra , pero esta aparece me

parece cuando hay demasiados datos en mi tabla, el cual me parece muy bueno, pero es automatico; quisiera saber como lo puedo implementar o llamar para todas mis sentencias Select; ya que me sirve para poder representar el tiempo que me va a tomar mi sentencia al menos cuando esta muy cargada mis tablas. Esta barra automatica es nueva en VFP 9.0; por que solo la he visto en esta versin ? Como la puedo activar en todos mis select? Gracias por la ayuda. -- SAMUEL SMH -Lima Peru

Luis Maria Guayan hace 5 aos Esta clase te puede ayudar: -- Mostrar el porcentaje de ejecucin de un comando SELECT o USE VIEW -http://www.portalfox.com/index.php?name=News&file=article&sid=46 -Luis Mara Guayn Tucumn, Argentina ________________________________ SysOp de www.PortalFox.com Microsoft Visual FoxPro MVP ________________________________ La palabra imposible solo figura en el diccionario de los tontos
Post by Samuel San Miguel Hernndez Select a.ordecodi as Codigo,ALLTRIM(b.clieapep)+' '+ALLTRIM(b.clieapem)+' '+ALLTRIM(b.clienomb) as Cliente,; c.estanomb as Estado,b.cliecodi as CodCliente,a.estacodi,emitidos.comproban from ordenes a INNER JOIN clientes b ON a.cliecodi=b.cliecodi; INNER JOIN estados c ON a.estacodi=c.estacodi ; LEFT OUTER JOIN ; (SELECT z.ordecodi,COUNT(d.ordecodi) as comproban ; FROM ordenes z INNER JOIN ordedocum d on z.ordecodi=d.ordecodi INNER JOIN ventas v ON ; d.tdoccodi+d.serie+d.numero=v.coddoc+v.serie+v.numero where v.flgborrado=.f. ; ORDER BY z.ordecodi GROUP BY z.ordecodi HAVING comproban=2) as emitidos ; ON a.ordecodi=emitidos.ordecodi WHERE a.estacodi<>'E02' INTO CURSOR cAuxiliar READWRITE el cual me funciona ok. pero me he dado cuenta que de vez en cuando me aparece una ventanita encima de mi form con una barra de progreso que va indicando el " Avance de mi select" como les comento yo no he programado ninguna barra , pero esta aparece me parece cuando hay demasiados datos en mi tabla, el cual me parece muy bueno, pero es automatico; quisiera saber como lo puedo implementar o llamar para todas mis sentencias Select; ya que me sirve para poder representar el tiempo que me va a tomar mi sentencia al menos cuando esta muy cargada mis tablas. Esta barra automatica es nueva en VFP 9.0; por que solo la he visto en esta versin ? Como la puedo activar en todos mis select? Gracias por la ayuda.

-- SAMUEL SMH -Lima Peru

integral hace 5 aos Que tal amigo Samuel Aqui el Cdigo de un ejemplo : 1. Crear un archivo de programa (.prg) en Visual FoxPro. 2. Coloque el cdigo siguiente en el archivo .prg: SET STATUS BAR ON PUBLIC obar **Open table cTable = GETFILE("dbf") IF EMPTY(cTable) RETURN .T. ENDIF **Create the Progress bar object obar = CREATEOBJECT("POnStatus") obar.pIndicatorStyle = "||" SELECT * FROM (cTable) WHERE obar.DrawStatus(RECNO(), RECCOUNT()) SET MESSAGE TO CLOSE ALL RELEASE ALL ** Class definition for the Progress bar object DEFINE CLASS POnStatus AS Custom pIndicatorStyle = "" PROCEDURE DrawStatus LPARAMETER nRecno, nReccount LOCAL nPtr, cIndicator nPtr = INT(nRecno*100/nReccount) cIndicator = REPLICATE(THIS.pIndicatorStyle, nPtr) + ; SPACE(2) + STR(nPtr)+"%" SET MESSAGE TO LEFT(cIndicator, LEN(cIndicator)) RETURN .T. ENDPROC ENDDEFINE Espero le sirva en algo

Saludos, Gabriel (Lima-Per)

On 26 mar, 22:02, "Samuel San Miguel Hernndez"


Post by Samuel San Miguel Hernndez Select a.ordecodi as Codigo,ALLTRIM(b.clieapep)+' '+ALLTRIM(b.clieapem)+' '+ALLTRIM(b.clienomb) as Cliente,; c.estanomb as Estado,b.cliecodi as CodCliente,a.estacodi,emitidos.comproban from ordenes a INNER JOIN clientes b ON a.cliecodi=b.cliecodi; INNER JOIN estados c ON a.estacodi=c.estacodi ; LEFT OUTER JOIN ; (SELECT z.ordecodi,COUNT(d.ordecodi) as comproban ; FROM ordenes z INNER JOIN ordedocum d on z.ordecodi=d.ordecodi INNER JOIN ventas v ON ; d.tdoccodi+d.serie+d.numero=v.coddoc+v.serie+v.numero where v.flgborrado=.f. ; ORDER BY z.ordecodi GROUP BY z.ordecodi HAVING comproban=2) as emitidos ; ON a.ordecodi=emitidos.ordecodi WHERE a.estacodi<>'E02' INTO CURSOR cAuxiliar READWRITE el cual me funciona ok. pero me he dado cuenta que de vez en cuando me aparece una ventanita encima de mi form con una barra de progreso que va indicando el " Avance de mi select" como les comento yo no he programado ninguna barra , pero esta aparece me parece cuando hay demasiados datos en mi tabla, el cual me parece muy bueno, pero es automatico; quisiera saber como lo puedo implementar o llamar para todas mis sentencias Select; ya que me sirve para poder representar el tiempo que me va a tomar mi sentencia al menos cuando esta muy cargada mis tablas. Esta barra automatica es nueva en VFP 9.0; por que solo la he visto en esta versin ? Como la puedo activar en todos mis select? Gracias por la ayuda. -- SAMUEL SMH -Lima Peru

integral hace 5 aos Que tal amigo Samuel Aqui el Cdigo de un ejemplo : 1. Crear un archivo de programa (.prg) en Visual FoxPro. 2. Coloque el cdigo siguiente en el archivo .prg: SET STATUS BAR ON PUBLIC obar **Open table cTable = GETFILE("dbf")

IF EMPTY(cTable) RETURN .T. ENDIF **Create the Progress bar object obar = CREATEOBJECT("POnStatus") obar.pIndicatorStyle = "||" SELECT * FROM (cTable) WHERE obar.DrawStatus(RECNO(), RECCOUNT()) SET MESSAGE TO CLOSE ALL RELEASE ALL ** Class definition for the Progress bar object DEFINE CLASS POnStatus AS Custom pIndicatorStyle = "" PROCEDURE DrawStatus LPARAMETER nRecno, nReccount LOCAL nPtr, cIndicator nPtr = INT(nRecno*100/nReccount) cIndicator = REPLICATE(THIS.pIndicatorStyle, nPtr) + ; SPACE(2) + STR(nPtr)+"%" SET MESSAGE TO LEFT(cIndicator, LEN(cIndicator)) RETURN .T. ENDPROC ENDDEFINE Espero le sirva en algo Saludos, Gabriel (Lima-Per) On 26 mar, 22:02, "Samuel San Miguel Hernndez"
Post by Samuel San Miguel Hernndez Select a.ordecodi as Codigo,ALLTRIM(b.clieapep)+' '+ALLTRIM(b.clieapem)+' '+ALLTRIM(b.clienomb) as Cliente,; c.estanomb as Estado,b.cliecodi as CodCliente,a.estacodi,emitidos.comproban from ordenes a INNER JOIN clientes b ON a.cliecodi=b.cliecodi; INNER JOIN estados c ON a.estacodi=c.estacodi ; LEFT OUTER JOIN ; (SELECT z.ordecodi,COUNT(d.ordecodi) as comproban ; FROM ordenes z INNER JOIN ordedocum d on z.ordecodi=d.ordecodi INNER JOIN ventas v ON ; d.tdoccodi+d.serie+d.numero=v.coddoc+v.serie+v.numero where v.flgborrado=.f. ;

ORDER BY z.ordecodi GROUP BY z.ordecodi HAVING comproban=2) as emitidos ; ON a.ordecodi=emitidos.ordecodi WHERE a.estacodi<>'E02' INTO CURSOR cAuxiliar READWRITE el cual me funciona ok. pero me he dado cuenta que de vez en cuando me aparece una ventanita encima de mi form con una barra de progreso que va indicando el " Avance de mi select" como les comento yo no he programado ninguna barra , pero esta aparece me parece cuando hay demasiados datos en mi tabla, el cual me parece muy bueno, pero es automatico; quisiera saber como lo puedo implementar o llamar para todas mis sentencias Select; ya que me sirve para poder representar el tiempo que me va a tomar mi sentencia al menos cuando esta muy cargada mis tablas. Esta barra automatica es nueva en VFP 9.0; por que solo la he visto en esta versin ? Como la puedo activar en todos mis select? Gracias por la ayuda. -- SAMUEL SMH -Lima Peru

Samuel San Miguel Hernndez hace 5 aos Hola foro, muy buenas las posibles soluciones, sin embargo les comento lo que consegui al probarlas para que lo tengan en consideracin: 1. la barra de Enrique Jaco , como el mismo lo dice, tarda mas al ejecutar su SELECT con esta barra; es debido a que primero esta preparando(ejecuntando en el servidor) y luego lo envia al cliente ; y al final hace un scan a ese select en ejecucion, es como si lo ejecutara casi 2 veces... por eso es lento. 2. la barra de Integral, esa si es en tiempo real pero el inconveniente es que solo funciona con DBF; por las funciones RECNO Y RECCOUNT;. estas no existen en SQL y tampoco podria ejecutar la clase obar.DrawStatus en el momento. SELECT * FROM (cTable) WHERE obar.DrawStatus(RECNO(), RECCOUNT()) solo funciona en DBF, pero ademas de eso , solo permite ejecutarlo y obtener buenos resultados con un SELECT a una sola tabla, SI TU SELECT ES a 2 mas tablas (INNER JOIN) no funciona el calculo. 3. la barra de Luis Maria no la pude ejecutar, no obtenia error pero no se visualizaba la barra... espero que si lo prob, nos mencione si no tiene estos 2 problemas mencionados. Muy buenos aportes pero por ahora sigo sin obtener una solucin estable. Saludos y Gracias por los comentarios. -[Samuel San Miguel Hernndez] [ Lima Per ] "integral" <***@hotmail.com> escribi en el mensaje news:90628e42-90664ed3-a105-***@y21g2000hsf.googlegroups.com...

Que tal amigo Samuel Aqui el Cdigo de un ejemplo : 1. Crear un archivo de programa (.prg) en Visual FoxPro. 2. Coloque el cdigo siguiente en el archivo .prg: SET STATUS BAR ON PUBLIC obar **Open table cTable = GETFILE("dbf") IF EMPTY(cTable) RETURN .T. ENDIF **Create the Progress bar object obar = CREATEOBJECT("POnStatus") obar.pIndicatorStyle = "||" SELECT * FROM (cTable) WHERE obar.DrawStatus(RECNO(), RECCOUNT()) SET MESSAGE TO CLOSE ALL RELEASE ALL ** Class definition for the Progress bar object DEFINE CLASS POnStatus AS Custom pIndicatorStyle = "" PROCEDURE DrawStatus LPARAMETER nRecno, nReccount LOCAL nPtr, cIndicator nPtr = INT(nRecno*100/nReccount) cIndicator = REPLICATE(THIS.pIndicatorStyle, nPtr) + ; SPACE(2) + STR(nPtr)+"%" SET MESSAGE TO LEFT(cIndicator, LEN(cIndicator)) RETURN .T. ENDPROC ENDDEFINE Espero le sirva en algo Saludos, Gabriel (Lima-Per)

On 26 mar, 22:02, "Samuel San Miguel Hernndez"


Post by Samuel San Miguel Hernndez Select a.ordecodi as Codigo,ALLTRIM(b.clieapep)+' '+ALLTRIM(b.clieapem)+' '+ALLTRIM(b.clienomb) as Cliente,; c.estanomb as Estado,b.cliecodi as CodCliente,a.estacodi,emitidos.comproban from ordenes a INNER JOIN clientes b ON a.cliecodi=b.cliecodi; INNER JOIN estados c ON a.estacodi=c.estacodi ; LEFT OUTER JOIN ; (SELECT z.ordecodi,COUNT(d.ordecodi) as comproban ; FROM ordenes z INNER JOIN ordedocum d on z.ordecodi=d.ordecodi INNER JOIN ventas v ON ; d.tdoccodi+d.serie+d.numero=v.coddoc+v.serie+v.numero where v.flgborrado=.f. ; ORDER BY z.ordecodi GROUP BY z.ordecodi HAVING comproban=2) as emitidos ; ON a.ordecodi=emitidos.ordecodi WHERE a.estacodi<>'E02' INTO CURSOR cAuxiliar READWRITE el cual me funciona ok. pero me he dado cuenta que de vez en cuando me aparece una ventanita encima de mi form con una barra de progreso que va indicando el " Avance de mi select" como les comento yo no he programado ninguna barra , pero esta aparece me parece cuando hay demasiados datos en mi tabla, el cual me parece muy bueno, pero es automatico; quisiera saber como lo puedo implementar o llamar para todas mis sentencias Select; ya que me sirve para poder representar el tiempo que me va a tomar mi sentencia al menos cuando esta muy cargada mis tablas. Esta barra automatica es nueva en VFP 9.0; por que solo la he visto en esta versin ? Como la puedo activar en todos mis select? Gracias por la ayuda. -- SAMUEL SMH -Lima Peru

Luis Maria Guayan hace 5 aos La barra se muestra si la consulta no es tan rpida. Ejecuta el siguiente ejemplo que el resultado es un cursor de mas de 1.000.000 de registros y al menos tarda unos segundos en ejecutarse: LOCAL loBar loBar = CREATEOBJECT("SQLBar") SELECT * ; FROM (HOME(2)+"Tastrade\Data\Orders") T1, ; (HOME(2)+"Tastrade\Data\Orders") T2 RELEASE loBar *---------------------------------------* Comienzo la definicin de la clase *---------------------------------------DEFINE CLASS SQLBar AS CUSTOM

PROTECTED lSetTalk, lWindows lSetTalk = "" lWindow = "" NAME = "SQLBar" PROCEDURE INIT THIS.lSetTalk = SET("TALK") THIS.lWindow = SYS(2015) DEFINE WINDOW (THIS.lWindow) FROM 0,0 TO 1,1 SET TALK WINDOW (THIS.lWindow) SET TALK ON ENDPROC PROCEDURE DESTROY LOCAL lThisSetTalk lThisSetTalk = THIS.lSetTalk SET TALK &lThisSetTalk RELEASE WINDOW (THIS.lWindow) ENDPROC ENDDEFINE *---------------------------------------* Final la definicin de la clase *---------------------------------------Post by Samuel San Miguel Hernndez Hola foro, muy buenas las posibles soluciones, sin embargo les comento lo que consegui al probarlas 1. la barra de Enrique Jaco , como el mismo lo dice, tarda mas al ejecutar su SELECT con esta barra; es debido a que primero esta preparando(ejecuntando en el servidor) y luego lo envia al cliente ; y al final hace un scan a ese select en ejecucion, es como si lo ejecutara casi 2 veces... por eso es lento. 2. la barra de Integral, esa si es en tiempo real pero el inconveniente es que solo funciona con DBF; por las funciones RECNO Y RECCOUNT;. estas no existen en SQL y tampoco podria ejecutar la clase obar.DrawStatus en el momento. SELECT * FROM (cTable) WHERE obar.DrawStatus(RECNO(), RECCOUNT()) solo funciona en DBF, pero ademas de eso , solo permite ejecutarlo y obtener buenos resultados con un SELECT a una sola tabla, SI TU SELECT ES a 2 mas tablas (INNER JOIN) no funciona el calculo. 3. la barra de Luis Maria no la pude ejecutar, no obtenia error pero no se visualizaba la barra... espero que si lo prob, nos mencione si no tiene estos 2 problemas mencionados. Muy buenos aportes pero por ahora sigo sin obtener una solucin estable. Saludos y Gracias por los comentarios. -[Samuel San Miguel Hernndez] [ Lima Per ] Que tal amigo Samuel 1. Crear un archivo de programa (.prg) en Visual FoxPro. SET STATUS BAR ON PUBLIC obar **Open table cTable = GETFILE("dbf") IF EMPTY(cTable)

RETURN .T. ENDIF **Create the Progress bar object obar = CREATEOBJECT("POnStatus") obar.pIndicatorStyle = "||" SELECT * FROM (cTable) WHERE obar.DrawStatus(RECNO(), RECCOUNT()) SET MESSAGE TO CLOSE ALL RELEASE ALL ** Class definition for the Progress bar object DEFINE CLASS POnStatus AS Custom pIndicatorStyle = "" PROCEDURE DrawStatus LPARAMETER nRecno, nReccount LOCAL nPtr, cIndicator nPtr = INT(nRecno*100/nReccount) cIndicator = REPLICATE(THIS.pIndicatorStyle, nPtr) + ; SPACE(2) + STR(nPtr)+"%" SET MESSAGE TO LEFT(cIndicator, LEN(cIndicator)) RETURN .T. ENDPROC ENDDEFINE Espero le sirva en algo Saludos, Gabriel (Lima-Per) On 26 mar, 22:02, "Samuel San Miguel Hernndez" Post by Samuel San Miguel Hernndez Select a.ordecodi as Codigo,ALLTRIM(b.clieapep)+' '+ALLTRIM(b.clieapem)+' '+ALLTRIM(b.clienomb) as Cliente,; c.estanomb as Estado,b.cliecodi as CodCliente,a.estacodi,emitidos.comproban from ordenes a INNER JOIN clientes b ON a.cliecodi=b.cliecodi; INNER JOIN estados c ON a.estacodi=c.estacodi ; LEFT OUTER JOIN ; (SELECT z.ordecodi,COUNT(d.ordecodi) as comproban ; FROM ordenes z INNER JOIN ordedocum d on z.ordecodi=d.ordecodi INNER JOIN ventas v ON ; d.tdoccodi+d.serie+d.numero=v.coddoc+v.serie+v.numero where v.flgborrado=.f. ; ORDER BY z.ordecodi GROUP BY z.ordecodi HAVING comproban=2) as emitidos ; ON a.ordecodi=emitidos.ordecodi WHERE a.estacodi<>'E02' INTO CURSOR cAuxiliar READWRITE el cual me funciona ok. pero me he dado cuenta que de vez en cuando me aparece una ventanita encima de mi form con una barra de progreso que va indicando el " Avance de mi select" como les comento yo no he programado ninguna barra , pero esta aparece me parece cuando hay demasiados datos en mi tabla, el cual me parece muy bueno, pero es automatico; quisiera saber como lo puedo implementar o llamar para todas mis sentencias Select; ya que me sirve para poder representar el tiempo que me va a tomar mi sentencia al menos cuando esta muy cargada mis tablas. Esta barra automatica es nueva en VFP 9.0; por que solo la he visto en esta versin ? Como la puedo activar en todos mis select? Gracias por la ayuda. -- SAMUEL SMH -Lima Peru

8 Respuestas 38 Views

Cerrado a nuevas respuestas Desactivar el parsing avanzado Permalink a esta pgina

Temas similares
None feedback - contacto - nota legal
Visual Fox Pro, Ejemplos - Cdigo fuente, Bases de datos, SQL ServerAgregar Comentarios
Un ejemplo bastante til, que nos permite poder consultar nuestras tablas de VFP desde SQLServer. Puede probarlo desde el analizador de consultas de SQL Server Ejemplo utilizando tablas libres de VFP

sp_addlinkedserver @server = "VFPoledbDbf", @srvproduct = "VFP", @provider = "VFPOLEDB.1", @datasrc = "C:RutaTablas" GO SELECT * FROM VFPoledbDbf...products GO sp_dropserver @server = "VFPoledbDbf" GO
Ejemplo utilizando tablas contenidas en una Base de datos de VFP

sp_addlinkedserver @server = "VFPoledbDBC2, @srvproduct = "VFP", @provider = "VFPOLEDB.1", @datasrc = "C:RutaTablas estdata.dbc" GO SELECT * FROM VFPoledbDBC...Products GO sp_dropserver @server = "VFPoledbDBC" GO

Consulta lenta desde VFP y Rpido desde SQL


28 entradas de 15 autores

Alci 05/08/13

Hola a todos, Tengo un reporte que realiza una simple consulta no muy compleja, desde el lado del SQL es decir desde SQL Server Management Studio la consulta en realiza en pocos segundos, pero al ejecutar desde la aplicacin demora mucho mas. El select es con cuatro tablas que realiza un suma de unos campos para mostrar el saldo total de la deuda de los cliente, no tiene nada de especial, tiene filtro por tipo de crdito, cdigo de cliente y cosas por el estilo. Desde el lado del SQL M.S. demora entre 1 a 3 segundo en mostrar el resultado, pero desde el informe demora aproximadamente entre 30 a 40 segundos, ya es mucho para estar mirando el monitor jejeje. Porque podra ser eso, alguien tiene alguna sugerencias? Saludos, Alcides.

Luis Maria Guayan 05/08/13


Podras poner la clausula SELECT e informar cuantos registros es el resultado? Luis Mara Guayn Tucumn, Argentina _________________________ http://www.PortalFox.com Nada corre como un zorro _________________________ El 05/08/2013 11:46, Alci escribi:
- mostrar texto citado -

DSANCHEZ 05/08/13
Hola, es interesante este tema, sorry x meter mi cuchara, pero he notado desde sql server 2005 que las consultas se hacen lentas desde vfp, en sql server 2000, bien rapido y en mysql server ya ni digamos consigos respuestas super rapidas, pero como les dije cualquier consulta de tipo select idclientes, codcliente, nombres, saldo from tblclientes order by idclientes

select idproveedores, codprov, nombres, saldo from tblProveedores order by idproveedores Hice estas dos consultas y dilata demasiado en vfp y vb.net, para lo que dilata en mysql server o mariadb. Esta consulta la cargue en un form, dilata el triple de lo que me carga en sql server e incluso de oracle recibo mayor velocidad. Creo que es lo mismo que te sucede, o sera coincidencia. Saludes Douglas

El 5 de agosto de 2013 08:47, Luis Maria Guayan <luism...@gmail.com> escribi:


- mostrar texto citado -

-Ing. Douglas Snchez Guilln Consultor Informatico Claro: 505 88495476

Luis Mata 05/08/13 Yo trabaje con SQL 2008 actualmente con 2012, como te dicen seria bueno que coloques el codigo para mirarlo.
From: Douglas Snchez Sent: Monday, August 05, 2013 9:59 AM To: publice...@googlegroups.com Subject: Re: [vfp] Consulta lenta desde VFP y Rpido desde SQL
- mostrar texto citado -

Ariel 05/08/13

probaste configurando el ODBC para sqlserver? a mi me pasaba y con eso se soluciono -Ariel D'Alfeo Crdoba, Argentina

El 05/08/2013 11:59, Douglas Snchez escribi:


- mostrar texto citado -

Fernando D. Bozzo 05/08/13


En general todos los problemas de lentitud de las consultas del lado de FoxPro suelen ser porque no se usan los ndices correctamente, o sea, la optimizacin Rushmore. Eso se puede verificar poniendo SYS(3054,11) en la ventana de comandos antes de ejecutar la consulta, luego el resultado esperado debera decir que la optimizacin es parcial o total, pero si dice "none" (o ninguna), entonces este es el problema. Si el filtro se est haciendo por tipo de crdito, cdigo de cliente y otros, entonces debera haber un ndice con cada una de esas claves, aunque en Fox la mayor velocidad se suele obtener con una nica clave que sea la suma de los campos del filtro, aunque incluso con los ndices muchos suelen poner mal luego la condicin en el Select-SQL.

Roberto Retegui Kanashiro

05/08
Re: [vfp] Re: Consulta lenta desde VFP y Rpido desde SQL

Fernando no son tablas nativas, el usa SQL Server, yo tambin note eso, tengo unas consultas que me usa vistas anidadas y en el mismo navicat lo hace rapidicimo pero en el Fox se demora unos varios segundo, hasta el momento no se el porque. Aunque creo que el problema es por que el vfp no maneja multi hilos para llenar la tabla, una vez que haces el select el vfp no para hasta llenar toda la tabla, mientras que en Lazarus le llena una parte y luego le va llenando de a pocos. Saludos

El 5 de agosto de 2013 10:38, Fernando D. Bozzo <fdb...@gmail.com> escribi:

En general todos los problemas de lentitud de las consultas del lado de FoxPro suelen ser porque no se usan los ndices correctamente, o sea, la optimizacin Rushmore. Eso se puede verificar poniendo SYS(3054,11) en la ventana de comandos antes de ejecutar la consulta, luego el resultado esperado debera decir que la optimizacin es parcial o total, pero si dice "none" (o ninguna), entonces este es el problema. Si el filtro se est haciendo por tipo de crdito, cdigo de cliente y otros, entonces debera haber un ndice con cada una de esas claves, aunque en Fox la mayor velocidad se suele obtener con una nica clave que sea la suma de los campos del filtro, aunque incluso con los ndices muchos suelen poner mal luego la condicin en el Select-SQL.

-btnMyVideo.Click()

Alci 05/08/13
Tratare de explicar lo que paso. El sistema esta diseado para ser multi-empresa, en todas las tablas tiene el cdigo de la empresa... La consulta devuelve correctamente los datos porque en la BD que utilizo hay una sola empresa, lo que paso fue que en la consulta no se realizo ningn filtro por empresa, no pase como parametro el cdigo de la empresa. Al agregar en el filtro el cdigo de la empresa mejoro la velocidad de la consulta, prcticamente se normalizo. Supongo que afecto al rendimiento al tener claves compuestas con el cdigo de la empresa en las tablas y por no utilizarlo dentro de la clausula where, porque en los join's si interviene. Re-configurando los driver o utilizando el SQL Native Client o SQL Server no cambiaba el comportamiento. Segua igual. Lo raro de esto es que con el SQL Server Management Studio la consulta es rpida, pero desde el lado del vfp demoraba bastante. Gracias a todos. Saludos.

Alcides Portillo PD: Para Fernando D. Bozzo, la Base de datos que utilizo es del SQL Server, por lo tanto no afecta la tecnologa Rushmore, la consulta se resuelve del lado del servidor y no del VFP, de todos modos gracias por tu aporte.

Roberto Retegui Kanashiro

05/08
Re: [vfp] Re: Consulta lenta desde VFP y Rpido desde SQL

Alci otra cosa que tambin me sucedi y lo soluciones es crear indices por los campos que condicionan la consulta, cuando los datos son bastantes se empieza a hacer lenta la consulta. Saludos

El 5 de agosto de 2013 11:25, Alci <alcides...@gmail.com> escribi:


- mostrar texto citado -

-btnMyVideo.Click()

Fernando D. Bozzo 05/08/13


Re: [vfp] Re: Consulta lenta desde VFP y Rpido desde SQL

Ahora te entiendo. FoxPro tambin puede hacer ese tipo de consulta, que se llama asincrnica. El problema en ese caso es que la ventaja que se le pueda sacar a poder ir viendo resultados de a poco se pierde en velocidad, por eso las consultas sincrnicas son ms rpidas. Igualmente me extraa que te tarde tanto. de cuntos registros hablamos? y que tamao de registro? Porque del lado del cliente solo veo que puedan influir dos cosas, el diversos usado y la configuracin que se use. Aport ms datos, a ver si se puede ver la causa aparente. Adems de lo que te pregunt ms arriba, pon el driver que uss y con que configuracin lo ests usando.

El 05/08/2013 18:17, "ZeRoberto" <zero...@gmail.com> escribi:


- mostrar texto citado -

Luis Mata 05/08/13


Re: [vfp] Re: Consulta lenta desde VFP y Rpido desde SQL

Hay que construir bien las consultas, muchas veces son errores nuestros, a mi me paso una consulta construida al guerrazo para salir de paso, demoraba casi 30 minutos, lo deje pero al final lo revise y la misma informacin con una select optimizado con indices, inner join, select(select).. bajo a menos de 1 minuto.
From: Alci Sent: Monday, August 05, 2013 11:25 AM To: publice...@googlegroups.com Subject: [vfp] Re: Consulta lenta desde VFP y Rpido desde SQL
- mostrar texto citado -

Milton 05/08/13
Cuando envas desde VFP a SQL Server una consulta mediante SELECT, por ms sensilla que sea, esta tiene que compilarse. Se puede mejorar la velocidad de respuesta si pones el SELECT dentro de una funcin, y llamas de VFP a esta funcin mediante parmetros, de esta manera la consulta est siempre precompilada y el proceso de consulta ser ms rpida. Ejm: Consulta lenta = SQLExec(1,'SELECT * FROM Clientes FOR ClienteId=100' ,'Cursor')

Ejm: Consulta rpida -- PRIMERO EJECUTAR ESTO EN SQL M.S.E CREATE FUNCTION [dbo].[DatosCliente] (@ClienteId int) RETURNS TABLE AS RETURN ( SELECT A.*, B.GruInvNomb FROM Clientes WHERE ClientesId=@ClienteId )

* AHORA EJECTA ESTO DESDE VFP = SQLExec(1,'SELECT * FROM dbo.DatosCliente(100)' ,'Cursor') Esto no necesita de complatacin, porque la FUNCION DatosCliente ya esta precompilada. De todas maneras me parece mucho tiempo el que tu indicas, puede intentar lo que te indico y mucha suerte. Atentametne

MILTON

El lunes, 5 de agosto de 2013 09:46:13 UTC-5, Alci escribi:


- mostrar texto citado -

Roberto Retegui Kanashiro

05/08
Re: [vfp] Re: Consulta lenta desde VFP y Rpido desde SQL

El tiempo de compilacin no creo que le demore minutos, eso lo hace en nano segundos.

El 5 de agosto de 2013 11:56, Milton <servy...@hotmail.com> escribi:


- mostrar texto citado -

-btnMyVideo.Click()

Fernando D. Bozzo 05/08/13


Re: [vfp] Re: Consulta lenta desde VFP y Rpido desde SQL

Tampoco hace falta llegar al extremo, las consultas externas se pueden optimizar en fox de varias formas, por ejemplo precompilndola en Fox con sqlprepare y usando bind variables para no meter los datos directamente, sino con ?Var en los parmetros El 05/08/2013 18:57, "Milton" <servy...@hotmail.com> escribi:
- mostrar texto citado -

Fernando D. Bozzo 05/08/13


Re: [vfp] Re: Consulta lenta desde VFP y Rpido desde SQL

Ojo, los tiempos de compilacin s que influyen, aunque tomen algo menos de un segundo (no son nanosegundos ni en el propio servidor), se notan y mucho cuando hay que realizar muchas consultas seguidas, por ejemplo en un proceso tipo batch. El 05/08/2013 19:01, "ZeRoberto" <zero...@gmail.com> escribi:
- mostrar texto citado -

Roberto Retegui Kanashiro

05/08
Re: [vfp] Re: Consulta lenta desde VFP y Rpido desde SQL

Pero si la consulta en si demora 0.33 segundos entonces cuando demorara la compilacin.

El 5 de agosto de 2013 12:08, Fer <fdb...@gmail.com> escribi:


- mostrar texto citado -

-btnMyVideo.Click()

Fernando D. Bozzo 05/08/13


Re: [vfp] Re: Consulta lenta desde VFP y Rpido desde SQL

Puede que unas cuantas centsimas de segundo El 05/08/2013 19:27, "ZeRoberto" <zero...@gmail.com> escribi:
- mostrar texto citado -

Miguel 05/08/13
Re: [vfp] Re: Consulta lenta desde VFP y Rpido desde SQL

SQL Server usa rushmore desde la versin 7. Una de las razones por las que M$ no suelta los fuentes de Fox. Parece que ese tipo de algoritmo no se puede patentar o es difcil de probar robo de idea con algo equivalente. Esto es lo que en algn lado se dijo, no se cuando ni quien cuando salio el SQL Server 7. Saludos: Miguel, La Pampa (RA)

El 5 de agosto de 2013 14:30, Fer <fdb...@gmail.com> escribi:


- mostrar texto citado -

David Salazar 05/08/13


Re: [vfp] Re: Consulta lenta desde VFP y Rpido desde SQL

Como curiosidad porque no haces un procedimientos almacenado con tu consulta, le envias los parametros, y lo ejecutas desde fox, y ves los tiempos que tarda.

2013/8/5 Carlos Miguel FARIAS <carlosmig...@gmail.com>


- mostrar texto citado -

Luis Mata 05/08/13


Re: [vfp] Re: Consulta lenta desde VFP y Rpido desde SQL

Esta es una buena idea, pero de todas maneras si la consulta esta mal construida o los ndices estn mal definidos no funcionaria.
From: David Salazar Sent: Monday, August 05, 2013 4:42 PM To: publice...@googlegroups.com Subject: Re: [vfp] Re: Consulta lenta desde VFP y Rpido desde SQL
- mostrar texto citado -

mpulla 05/08/13
Re: [vfp] Re: Consulta lenta desde VFP y Rpido desde SQL

Hola Alci. Puedes medir el tiempo que demora desde hacer el pedido hasta que te devuelve el resultado? Como dice David, crate un SP y compara los tiempos. Pienso que la diferencia debe ser minima, entre ejecutarlo en Sql Server Management y VFP. Saludos. Mauricio

Alci 06/08/13
El problema estaba en el filtro de la consulta, falto agregar el Cdigo de la Empresa en el Where de la consulta, supongo que afecto el rendimiento como las claves son compuesta con campo cdigo de la empresa (IdEmpresa). No me di cuenta porque en la Base de Datos que estaba utilizando solo tengo cargado datos de una empresa, es por eso que los resultados eran correctos y no me di cuenta que falto el filtro de la empresa. Despus de agregar el filtro por empresa en la clausula where se normalizo. Gracias a todos por su valiosa colaboracin.

Saludos. Alcides.

Victor Manuel Thomas 19/11/13


HOla todos ! me gustara saber si encontraron alguna solucin, ya que tengo el mismo inconveniente, tengo una consulta de 300,000 registros que a su ves se convierten en 30 registros como resumen, igual en sql manage corre en 9 segundos pero desde el lado de fox se tarda 20 minutos, tengo creado un SP del lado del servidor que era bastante rapido al principio pero a medida a ah ido creciendo la data se torno lento la consulta del lado de fox, tengo VPF9 y SQL Server 2008 R2 Express. cuenta con todos los indices necesarios pero por si alguien sabe de algo q pueda ayudarme. Por cierto probe con ODBC y efectivamente corre a la velocidad de SQL Manage pero ir a configurar ODBC a 50 equipos no tiene mucha gracia, menos cuando tienes que cambiar clave cada cierto tiempo. saludos PD les dejo la la construccin del string, que funciona muy bien para tablas simples y reportes no mayores de 100,000 registros. que a mas de uno se que le servira. DRIVER=SQL Server UID=sa LANGUAGE=Espaol DATABASE=midata WSID=MIPC APP=Sistema operativo Microsoft Windows SERVER=servidor\instancia Description=Conexion ....

El lunes, 5 de agosto de 2013 08:46:13 UTC-6, Alci escribi:


- mostrar texto citado -

mpulla 19/11/13

Hola Victor. Traes 300,000 registros y los resumes en 30 la data es de 300,000 que los resumes en tu sp. En todo caso 300,000 resgistros es poco. 9 segundos es mucho tiempo, seria bueno ver tu sp, tablas e indices a ver si te podemos aportar algo. Saludos. Mauricio

Luis Mata 19/11/13


Re: [vfp] Re: Consulta lenta desde VFP y Rpido desde SQL

No quieres instalar el ODBC en cada PC? pero al menos hasta W7 ya viene preinstalado los ODBC
From: Victor Manuel Thomas Sent: Tuesday, November 19, 2013 1:19 PM To: publice...@googlegroups.com Subject: [vfp] Re: Consulta lenta desde VFP y Rpido desde SQL
- mostrar texto citado -

Miguel Canchas 19/11/13


RE: [vfp] Re: Consulta lenta desde VFP y Rpido desde SQL

Y el codigo ?

MK
De: publice...@googlegroups.com [mailto:publice...@googlegroups.com] En nombre de Victor Manuel Thomas Enviado el: martes, 19 de noviembre de 2013 01:19 p.m.

Para: publice...@googlegroups.com Asunto: [vfp] Re: Consulta lenta desde VFP y Rpido desde SQL

HOla todos ! me gustara saber si encontraron alguna solucin, ya que tengo el mismo inconveniente, tengo una consulta de 300,000 registros que a su ves se convierten en 30 registros como resumen, igual en sql manage corre en 9 segundos pero desde el lado de fox se tarda 20 minutos, tengo creado un SP del lado del servidor que era bastante rapido al principio pero a medida a ah ido creciendo la data se torno lento la consulta del lado de fox, tengo VPF9 y SQL Server 2008 R2 Express. cuenta con todos los indices necesarios pero por si alguien sabe de algo q pueda ayudarme.

Por cierto probe con ODBC y efectivamente corre a la velocidad de SQL Manage pero ir a configurar ODBC a 50 equipos no tiene mucha gracia, menos cuando tienes que cambiar clave cada cierto tiempo.

saludos

PD les dejo la la construccin del string, que funciona muy bien para tablas simples y reportes no mayores de 100,000 registros. que a mas de uno se que le servira.

DRIVER=SQL Server UID=sa LANGUAGE=Espaol DATABASE=midata WSID=MIPC APP=Sistema operativo Microsoft Windows SERVER=servidor\instancia Description=Conexion ....

El lunes, 5 de agosto de 2013 08:46:13 UTC-6, Alci escribi: Hola a todos,

Tengo un reporte que realiza una simple consulta no muy compleja, desde el lado del SQL es decir desde SQL Server Management Studio la consulta en realiza en pocos segundos, pero al ejecutar desde la aplicacin demora mucho mas.

El select es con cuatro tablas que realiza un suma de unos campos para mostrar el saldo total de la deuda de los cliente, no tiene nada de especial, tiene filtro por tipo de crdito, cdigo de cliente y cosas por el estilo.

Desde el lado del SQL M.S. demora entre 1 a 3 segundo en mostrar el resultado, pero desde el informe demora aproximadamente entre 30 a 40 segundos, ya es mucho para estar mirando el monitor jejeje.

Porque podra ser eso, alguien tiene alguna sugerencias?

Saludos,

Alcides.

mapner 19/11/13

Fijate si tus tablas tienen campos BLOB y los ests trayendo en la consulta. El uso de campos BLOB enlentece mucho a la hora de traer datos por ODBC hacia VFP. saludos El lunes, 5 de agosto de 2013 11:46:13 UTC-3, Alci escribi: Hola a todos, Tengo un reporte que realiza una simple consulta no muy compleja, desde el lado del SQL es decir desde SQL Server Management Studio la consulta en realiza en pocos segundos, pero al ejecutar desde la aplicacin demora mucho mas. El select es con cuatro tablas que realiza un suma de unos campos para mostrar el saldo total de la deuda de los cliente, no tiene nada de especial, tiene filtro por tipo de crdito, cdigo de cliente y cosas por el estilo. Desde el lado del SQL M.S. demora entre 1 a 3 segundo en mostrar el resultado, pero desde el informe demora aproximadamente entre 30 a 40 segundos, ya es mucho para estar mirando el monitor jejeje. Porque podra ser eso, alguien tiene alguna sugerencias? Saludos,

Alcides.

MALKASOFT ADPI: http://www.developervfp.blogspot.com/

Hola, te recomiendo que no uses Select * From, debes usar Select Campo1, Campo2 etc From, ahora aparte de index normales como pk y fk tiene que crear indices CLUSTERED o NOCLUSTERED eso ara que tu consulta sea muy rpido cuando lo llames de cualquier herramienta de programacin. te paso un link para que veas la diferencia http://grimpidev.wordpress.com/2008/03/08/diferencias-entre-clustered-y-non-clusteredindex-en-sql-server/

Saludos;

Ing. Russvell Jesus Soto Gamarra http://developervfp.blogspot.mx/ Framework Multi-conexion a cualquier base de datos v6.0 http://www.youtube.com/watch?v=PCCZvCaet74 Canal YouTube: http://www.youtube.com/rycjesusrj

Comunidad de Visual Foxpro en Espaol

Algunas consultas en base a SQL


3 entradas de 3 autores

Marcelo Barberis 07/01/12 Estimados amigos Estoy empezando un proyecto y lo voy a realizar bajo db sql, ahora bien yo siempre trabaje con tablas nativas de vfp9 sp2 y voy incursionar con sql, ya recopile cierta informacion necesaria para trabajar con vfp y sql, ahora mi consulta se basa en lo siguiente: En todos mis sistema controlo si el exe va a trabajar como demo o registrado, para esto mis sistemas crean en tiempo de ejecucion 5 tablas para controlar este tipo de trabajo, la fecha de instalacion, el tiempo que le doy para su uso, utilizo el sistema 30 usos y despues caduca creando archivos dll en el window/sistem/, estas tablas se crean al iniciar la aplicacion, mostrando una pantalla splash, si esta dentro de los 30 usos muestra una pantalla que sirva

para registrar el sistema si no lo hizo todavia y despues de esta pantalla aparece la pantalla del usuario, donde pones los datos del usuario y la contrasea, si es primera vez te crea la tabla usuario y los datos nuevos se registran para su posterior uso, si entra con todo correcto utilizas el sistema. Si trabajo con tablas nativas no hay problemas, porque siempre lo hice asi, mi inquietud es que quiero agregar una funcionalidad a este nuevo proyecto un form para elegir el motor DB sql (oracle, mysql, firebird sql, sql server), si es primera vez aparecera este form para elegir el motor de BD en sql una vez pasado este form guardo estos datos en un archivo ini de configuracion para que sistema ingrese sin mostrar nuevamente este form, este form iria antes del de usuari y contrasea, como dije antes aparecera cuando es primera vez que se ingresa al sistema. Se puede trabajar con tablas dbf para hacer el trabajo de verificacion del sistema como ser control de contrasea, verificacion si es registrado, fecha de instalacion del sistema, etc... que toda esta info la guardo en tablas (son 5 tablas) y los demas trabajo del sistema como la BD en si, en sql? Bueno espero haberme hecho entender un poco de lo que deseo realizar, cualquier aporte le agradeceria mucho. Marcelo

Walter R. Ojeda Valiente 07/01/12 Hola Marcelo Desde luego que puedes usar en una misma aplicacin tablas .DBF y tablas SQL, ningn problema con eso. De hecho yo lo hago as, uso unas tablas auxiliares locales a la computadora de cada usuario que son .DBF, de esa manera consigo que los accesos sean rapidsimos y que se utilice la red el mnimo posible, que es siempre lo ideal. Saludos. Walter.

Date: Sun, 8 Jan 2012 03:12:08 +0100 Subject: [vfp] Algunas consultas en base a SQL

From: alexm...@gmail.com To: publice...@googlegroups.com


- mostrar texto citado -

Anthony GeoSys 08/01/12 Marcelo, las tablas DBF son importantsimas en VFP, no importa con cual DB trabajes, lgicamente puedes hacer uso de ellas sin ningn problema, esa es una gran ventaja. Cuando haces una conslta sql, sin importar el motor de DB VFP lo que hace es crear un cursor y alojar la consulta all.
Que es un cursor? R/ Un cursor es una tabla temporal DBF creada a partir de una consulta o usando CREATE CURSOR, esta tabla se aloja en la computadora local donde se haga la consulta por eso es rapidsimo luego manipular esos datos. Las DBFs sern siempre de vital importancia para trabajar con VFP aunque se trabaje con cualquier motor de base de datos, y no vas a dejar de usarlas porque como te dije un cursor es una tabla temporal DBF, por eso no vas a tener ningn problema en eso.

Saludos Anthony Contreras Peralta Costa Rica.

Cmo determinar los niveles de optimizacin seleccione SQL afectar al rendimiento en Visual FoxPro 6.0 y versiones posteriores
Imprimir Correo electrnico

Seleccione idioma
Id. de artculo: 248608 - Ver los productos a los que se aplica este artculo

Ver renuncia de traduccin automtica Traduccin automtica en pginas de Microsoft Expandir todo | Contraer todo

Resumen

Para optimizar plenamente las consultas de Microsoft Visual FoxPro 6.0 y versiones posteriores, es necesario agregar etiq

JOIN. Adems, si tiene SET DELETED ON, debe tener un ndice enDELETED() a optimizar totalmente su consulta. Sin em

una Seleccione optimizar totalmente no puede mejorar el rendimiento y en realidad podra obstaculizar en algunos caso Volver arriba | Enviar comentarios

Ms informacin
una expresin de ndice. Por ejemplo, si una clusula donde UPPER(cName) = < algn valor >, debe tener un ndice con Rushmore optimizar la consulta.

Para que optimizar una consulta, la instruccin SELECT debe tener una clusula WHERE. La expresin de la izquierda del

En Visual FoxPro 5.0, Microsoft introdujo la funcin SYS(3054) para informar sobre el nivel de optimizacin Rushmore d

instruccin SELECT es donde clusula est realizando una combinacin (...) WHERE tableA.keyValue = tableB.keyValue), o dice, ".. ndice de usando temporal."

muestra de manera diferente que una clusula WHERE filtrada.Si la combinacin se optimiza, dice, "Joining tableA y tabl

Nota: optimizacin no siempre significa un rendimiento ms rpido que no sean de optimizacin. Debe probar en forma El cdigo de ejemplo siguiente muestra esto. Utiliza la base de datos testdata en el directorio Samples. SET DELETED OFF CLEAR CD HOME(2) + 'data' && Tools:Options:File Locations:Samples directory must && be set for HOME(2) to work.

= SYS(3054, 11)

&& Display optimization information for joins

? "Query 1:" lnStart = SECONDS() SELECT * ; FROM orders JOIN customer ; ON orders.cust_id = customer.cust_id ; INTO CURSOR crsrTemp ? SECONDS() - lnStart, _TALLY ?

? "Query 2:" lnStart = SECONDS() SELECT orders.* ; FROM orders JOIN customer ; ON orders.cust_id = customer.cust_id ; AND customer.cust_id = "BONAP" ; INTO CURSOR crsrTemp ? SECONDS() - lnStart, _TALLY ? ? "Query 3:" lnStart = SECONDS() SELECT orders.* ; FROM orders JOIN customer ; ON orders.cust_id = customer.cust_id ; AND customer.cust_id = "BONAP" ; AND orders.order_id > ' 10000' ; INTO CURSOR crsrTemp

? SECONDS() - lnStart, _TALLY La primera consulta devuelve todos los registros de pedidos. Tiempo de ejecucin es de ~.017 segundos en un equipo d optimizados, desde la clusula WHERE no filtra ninguna tabla. La combinacin se optimiza.

La segunda consulta devuelve 19 registros de pedidos. Tiempo de ejecucin es de ~.005 segundos en el mismo equipo.I combinacin, como en la primera consulta.

optimizado, porque la clusula WHERE tiene un filtro que coincide con una expresin de ndice en la tabla. La tabla de p

La tercera consulta devuelve 19 registros de pedidos. Tiempo de ejecucin tambin es ~.005 segundos en el mismo equ en la segunda consulta.

clientes como optimizado, as como la combinacin. Tenga en cuenta que, aunque esta consulta est totalmente optimiz

Si ejecuta el ejemplo de cdigo anterior con SET DELETED ON, cada consulta que se ha optimizado completamente par los tiempos de ejecucin son los mismos.

Es mejor para el rendimiento no debe crear una etiqueta DELETED() , aunque hace que la consulta slo parcialmente op

este comportamiento es que si trabaja en una red y se eliminan algunos registros, llevar la etiqueta DELETED() travs de

tiempo muy poca mejora en comparacin con el estado eliminado de los registros menos probando en el conjunto de re Al escribir consultas, debe:

Evitar combinaciones innecesarias. Asegrese de que las uniones se optimizan. Agregar etiquetas de ndice para utilizados con frecuencia las expresiones de condicin de combinacin no WHER ganancia de rendimiento de los ndices en campos de 1 byte o lgicos o DELETED() , aunque esto puede cambia completo. La prueba y prueba para asegurarse de que tiene lo que necesita para los ndices.

Una tcnica que puede utilizar en Visual FoxPro 5.0 o posterior para aislar los cuellos de botella de rendimiento consiste lento, no slo SELECT s, para mejorar su rendimiento. Volver arriba | Enviar comentarios

COVERAGE . Visual FoxPro 6.0 agrega al Analizador de trayecto que ayuda a analizar los resultados de cobertura. Debe c

Referencias

Para obtener ms informacin acerca de cmo optimizar las consultas, haga clic en el nmero de artculo siguiente para 155788 Cmo optimizar SQL utilizando la clusula de fuerza y SYS(3054) (c) Microsoft Corporation 2000, Reservados todos los derechos. Volver arriba | Enviar comentarios

Id. de artculo: 248608 - ltima revisin: lunes, 12 de febrero de 2007 - Versin: 3.4

La informacin de este artculo se refiere a:



Microsoft Visual FoxPro 9.0 Professional Edition Microsoft Visual FoxPro 8.0 Professional Edition Microsoft Visual FoxPro 7.0 Professional Edition Microsoft Visual FoxPro 6.0 Professional Edition

Palabras clave: kbmt kbperformance kbdatabase kbinfo kbsqlprog KB248608 KbMtes


Traduccin automtica

IMPORTANTE: Este artculo ha sido traducido por un software de traduccin automtica de Microsoft (http://support.microsoft.com/gp/mtde

ofrece artculos traducidos por un traductor humano y artculos traducidos automticamente para que tenga acceso en su propio idioma a to

(Knowledge Base). Sin embargo, los artculos traducidos automticamente pueden contener errores en el vocabulario, la sintaxis o la gramtic Microsoft suele actualizar el software de traduccin frecuentemente. Haga clic aqu para ver el artculo original (en ingls): 248608

el idioma. Microsoft no se hace responsable de cualquier imprecisin, error o dao ocasionado por una mala traduccin del contenido o com

Volver arriba | Enviar comentarios

Cmo optimizar los comandos SELECT SQL mediante el uso de la clusula de fuerza y SYS(3054) en

Visual FoxPro 5.0 y versiones posteriores


Imprimir Correo electrnico Seleccione idioma
Id. de artculo: 155788 - Ver los productos a los que se aplica este artculo

Ver renuncia de traduccin automtica Traduccin automtica en pginas de Microsoft Expandir todo | Contraer todo

Resumen

Microsoft Visual FoxPro 5.0 y versiones posteriores tienen una nueva clusula, la clusula de fuerza en el SELECT - comando SQL. P la optimizacin de la consulta predeterminada que realiza Visual FoxPro.

La clusula de fuerza especifica que las tablas estn combinadas en el orden en que aparecen en la clusula FROM. Si se omite la c la consulta. Sin embargo, Visual FoxPro puede ejecutar la consulta con mayor rapidez mediante la inclusin de la clusula de fuerza Visual FoxPro.

Ms informacin

Cuando se procesa una instruccin SQL, el optimizador SQL determina la forma ms eficaz a las tablas. Hay ocasiones cuando teng datos de FoxPro. La clusula de fuerza, indica a Visual FoxPro que se optimice la instruccin SELECT SQL y no es necesario cambiar

Para poder utilizar la clusula de fuerza, debe utilizar la sintaxis de combinacin ANSI dentro de la clusula FROM. Las condiciones de fuerza. Cuando se coloca la clusula de fuerza, es global para todas las combinaciones enumeradas. El orden en que aparecen la que stos se unen. Las instrucciones siguientes, por lo tanto, pueden producir resultados diferentes: OPEN DATABASE HOME(2)+"\data\testdata" SELECT * ; FROM FORCE customer JOIN(orders JOIN orditems ; ON orditems.order_id=orders.order_id) ; ON orders.cust_id=customer.cust_id SELECT * ; FROM FORCE customer JOIN orders ; ON orders.cust_id=customer.cust_id ; JOIN orditems ; ON orditems.order_id=orders.order_id

En la primera instruccin SELECT SQL, se unen los pedidos y las tablas orditems y el resultado se une a la tabla customer. En la segu

con la tabla orders en primer lugar. El resultado se combina con la tabla orditems.

Con el fin de tomar la decisin de forzar una condicin de combinacin, puede utilizar la funcin SYS(3054) para determinar la med tecnologa Rushmore. ? SYS(3054,1) SELECT * FROM customer JOIN orders; ON customer.cust_id=orders.cust_id ; WHERE UPPER(country)="USA"

SYS(3054) devuelve la informacin como la etiqueta de ndice que se utiliza para optimizar la unin, as como el nivel de optimizac A veces, puede determinar el mejor nivel de optimizacin por ensayo y error.

Id. de artculo: 155788 - ltima revisin: lunes, 12 de febrero de 2007 - Versin: 3.4

La informacin de este artculo se refiere a:



Microsoft Visual FoxPro 5.0 Standard Edition Microsoft Visual FoxPro 6.0 Professional Edition Microsoft Visual FoxPro 7.0 Professional Edition Microsoft Visual FoxPro 8.0 Professional Edition Microsoft Visual FoxPro 9.0 Professional Edition

Palabras clave: kbmt kbdatabase kbhowto kbsqlprog KB155788 KbMtes


Traduccin automtica

IMPORTANTE: Este artculo ha sido traducido por un software de traduccin automtica de Microsoft (http://support.microsoft.com/gp/mtdetails) en lug traducidos por un traductor humano y artculos traducidos automticamente para que tenga acceso en su propio idioma a todos los artculos de nuestra artculos traducidos automticamente pueden contener errores en el vocabulario, la sintaxis o la gramtica, como los que un extranjero podra cometer a cualquier imprecisin, error o dao ocasionado por una mala traduccin del contenido o como consecuencia de su utilizacin por nuestros clientes. Micro frecuentemente. Haga clic aqu para ver el artculo original (en ingls): 155788

Volver arriba | Enviar comentarios

FoxPro/Visual FoxPro Avanzado - Acelerar consulta SQL


Buscar

Volver

Agregar Nota <<>>

Vista:

arbol

Acelerar consulta SQL Mauricio (10/10/2009 17:39:39)3.976 visitas 0 respuesta

As un to:

Aceler ar consul ta SQL Mauri cio (2 11 interv encio nes) 10/10 /2009

0
Au tor :

Fe ch

a:

17:39: 39

Este es un articulo publicado en PortalFox, espero que a alguien le sea util: *--Aunque MySQL lleva su propio sistema de optimizacin cuando lanzamos un "Query SQL", nos es posible mediante programacin elegir el ndice que utilizar el MySQL en cada una de las tablas para optimizar nuestra consulta. Como es mejor un ejemplo que mil palabras, vamos a ilustrar un pequeo ejemplo desde nuestro querido Fox. Creamos en nuestra BBDD de MySQL una pequea tabla de apuntes contables. Con varios ndices (No.Apunte,SubCuenta,Fecha etc). DROP TABLE IF EXISTS apuntes; CREATE TABLE apuntes ( apunte decimal(8,0) default '0.00', fecha date default '2009-01-01', texto varchar(40) collate utf8_spanish_ci default '', cuenta varchar(10) collate utf8_spanish_ci default '0000000000', debe decimal(12,2) default '0.00', haber decimal(12,2) default '0.00', PRIMARY key (apunte), key K01 (fecha), key K02 (cscta)) ENGINE = InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_spanish_ci ROW_FORMAT=DYNAMIC ;Una vez visto el ejemplo de tabla, vamos a crear nuestra consulta en nuestro querido Fox. Y dependiendo de los datos que queramos extraer de la tabla, elegiremos que la consulta sea optimizada por un ndice determinado. ******************************************************************* * Ejemplo de Consulta Optimizada para MySQL ******************************************************************* KNDX = '' DO FORM FCONSULTA && (FORMULARIO DE CAPTURA DE VARIABLES) IF T1APTS = T2APTS KNDX = 'PRIMARY' ENDIF * IF T1FECHA = T2FECHA KNDX = 'K01' ENDIF * IF T1CUENTA = T2CUENTA KNDX = 'K02' ENDIF * TEXT TO XSQL TEXTMERGE NOSHOW SELECT * FROM apuntes FORCE INDEX(<<KNDX>>) WHERE apunte >= ?T1APTS AND apunte <= ?T2APTS AND fecha >= ?T1FECHA AND fecha <= ?T2FECHA AND cuenta >= ?T1CUENTA AND cuenta <= ?T2CUENTA ORDER BY apunte,fecha ENDTEXT * SQLPREPARE(NH, '' + XSQL, 'TCURSOR')

* DO WHILE SQLEXEC(NH) = 0 ENDDO BROWSE *******************************************************************Espero que el cdigo anterior sea descriptivo de lo que os quiero transmitir. En el ejemplo anterior utilizamos la variable KNDX que es la que almacena el ndice que queremos utilizar para optimizar nuestra consulta. Por defecto en este ejemplo concreto ponemos el valor del indice fecha 'K01'. Y utilizamos la orden FORCE INDEX para forzar al MySQL que utilice el ndice que le indicamos en cada consulta dependiendo de los valores que queramos extraer en cada momento. En tablas relativamente pequeas es posible que no se aprecie rendimiento alguno. Pero en consulta a tablas con mas de 2 Millones de registros, aseguro que el rendimiento es exponencial.

Comunidad de Visual Foxpro en Espaol

Acelerar Consulta SQL


7 entradas de 6 autores

ms-sql

Roberto Lemos 20/11/13 Buenos dias. Tengo el siguiente caso, una tabla de compras en la cual se registran todas las compras de la empresa y una de pagos, en la que voy registrando las cancelaciones y/o amortizaciones, en la misma tabla de compras tengo un campo Saldo, el cual me va dando el saldo al da, el problema surge que ahora me piden que presente un corte a un determinado mes, por ejemplo todas las facturas pendientes de cancelar al 31/10, en este reporte podrian aparecer facturas como por pagar, si estas por ejemplo se hubieran cancelado el 15/11. Lo que estoy haciendo es cargar todas las compras hasta el periodo solicitado en una tabla temporal, luego cargo los pagos realizados, voy recorriendo toda esta tabla, y actualizo los saldos, el resultado es lo que necesito, pero demora demasiado. Alguna alternativa que me puedan sugerir. Trabajo con SQL Server 2012

Saludos Roberto Lemos

Ricardo Pina 20/11/13


No se muestran las imgenes. Mostrar imgenes en esta entrada

Hola Roberto Tienes mal diseadas tus tablas, compras y pagos deben ir en una tabla ctacte, pero de todas maneras publica la consulta y es probable que la optimicemos. Saludos El 20 de noviembre de 2013 08:16, Roberto Lemos <lemo...@gmail.com> escribi:
- mostrar texto citado -

-Ricardo Pina Desarrollo y Servicios Informticos Profesionales www.dsip.com.ar

mpulla 20/11/13 Hola Roberto. Adems de lo que te pide Ricardo, sera bueno que ver la estructura de tus tablas, ndices y una muestra del resultado deseado. Saludos. Mauricio

MALKASOFT ADPI: http://www.developervfp.blogspot.com/

Hola en que tienes tu data, SQL Server no te vaya ayudar a que mejores el resultado de tu Select si tienes mal diseada tus tablas y ademas a ello tienes que tomar en cuenta que si no manejas indices como CLUSTERED o NON-CLUSTERED asi migres tu data a SQL Server siempre sera lenta.

Saludos;

Ing. Russvell Jesus Soto Gamarra http://developervfp.blogspot.mx/ Framework Multi-conexion v6.0 a cualquier base de datos http://www.youtube.com/watch?v=PCCZvCaet74 Canal YouTube: http://www.youtube.com/rycjesusrj

Andrs Oscar Gimbatti 20/11/13 Hola, yo trabajo con postgres, pero he tenido el mismo problema en algunos sistemas. La consulta al motor de base de datos la mejore MUCHISIMO creando un indice sobre el campo que tenia en el WHERE. Ej. tengo un sistema de estadisticas con una tabla con 6 millones de registros. Una consulta me tardaba en devolver el resultado 45 segundos, despus del indice me tardaba aproximadamente entre 5 y 10 segundos. Tratando de resolver el problema, me di cuenta que perda muchisimo mas tiempo trabajando los cursores una vez traidos, que si lo poda resolver en la consulta al motor de bases de datos. Esta es mi experiencia, espero te de un puntapie para lograr resolver el problema. Saludos PD: casi todos los motores tienen algun comando o alguna utilidad para medir las consultas, como ser la cantidad de registros que tuvo que leer para lograr el resultado, y de

esa forma darte cuenta si tenes que crear un indice, ojo con irte de mambo con los indices, a la larga y si es muy grande la tabla te lentifica los procesos de insert y delete demasiados indices.

Alejandro Isla 20/11/13

Hola, como dice, sin las tablas es hablar de supociciones, entonces, suponiendo: 1) que tenes un registro en ambas tablas que te relacionan las mismas, digamos cod_compra (index primario/unico para compras y en pagos indica a que compra est aplicado dicho pago, o porcin del pago)

podes hacer un select con algn group e inner join tipo: select cod_compra, max(monto_compra) as monto, sum(montos_pagos) as monto_cancelado from compras inner join (condicion) where fecha_compra<{xx/xx/xxxx} group by cod_compra es la idea que me pas por la cabeza... espero funcione. Saludos, Alejandro El mircoles, 20 de noviembre de 2013 08:16:20 UTC-3, Roberto Lemos escribi:
- mostrar texto citado -

Alejandro Isla 20/11/13


Me olvid, despus preguntas o filtras si monto = monto_cancelado para saber cuales estn canceladas.

David Acua Guzman Blog


Recursos de Informatica, programacin.

Optimizacin de consultas SQL en Visual Foxpro


Publicado en octubre 12, 2010

Rate This

Uno de los pasos ms traumticos para un programador de foxpro 2.5 a las ltimas versiones, es pensar en utilizar el SQL de forma ptima. Pasar de los bucles tipo SCAN/ENDSCAN DO/ENDDO a una sla instruccin, y que VFP decida qu ndice utilizar, no siempre se hace de la forma ms correcta. Una vez ms, la ayuda de fox est bien documentada. A considerar: - =SYS(3054,12). Permite conocer la optimizacin de rushome aplicada a la instruccin SQL. Con ella se pueden hacer pruebas y ver si se va por buen camino. - Ver si los ndices tienen clausulas FOR. Los ndices que use SQL deben ser sin clausulas FOR. - Construccin de la consulta where y el parmetro JOIN / ON. Fox a veces en un poco tonto. Hay que dejarle bien claro en el where y en el JOIN los condicionantes de la consulta si es compleja, para que no se desvie internamente generando miles de registros en alguna tambla temporal, para luego devolver 2 o tres 3 simples registros. - Parmetro FORCE en Select. Puede que FOX piense que su forma de proceder es la ideal para una buena respuesta, pero quien mejor que nosotros para conocer la naturaleza de la tabla. - Ojo con las subconsultas. Fox va ms rpido si la respuesta de la subconsulta tiene los valores esperados al principo de la misma, cuando stos son comparados con la consulta principal. Hay veces que un LEFT join o una subconsulta pueden hacer lo mismo, pero depender del caso, una opcin puede ser mejor que la otra. Una vez ms, lo mejor es hacer pruebas.

- Obtener slo aquellos campos de las tablas que vamos a usar. Especialmente importante cuando hay campos memos en las mismas. - Indicar para cada campo, la tabla de la que procede (Ejemplo: tabla facturas, campo nmero > facturas.numero). No se notar en el rendimiento, pero nos evitar problemas en un futro si aadimos ms campos a la tabla, y coincidan los nombres de los campos en varias tablas. Hay que prestar especial cuidado con los parmetros Where y los ndices existentes. Una optimizacin puede ser total o parcial. Para que la consulta sea rpida, hay que luchar para conseguir que la optimizacin sea total, y con el ndice que nosotros queremos, que no siempre es el que FOX decide utilizar. Si tenemos un ndice del tipo EMPRESA+str(NUMFACTURA,10) la consulta Select podra ser: select * from fichero where empresa=PR and numfactura=100 < optimizacin parcial, slo por codigo de empresa Selet * from fichero where empresa+str(numfactura,10) = PR+str(100,10) < optmizacin plena. Siguiendo este mismo principio, se pueden hacer consultas complejas con varias tablas relacionadas en la consulta y conseguir una respuesta rpida, al nivel de respuesta de un bucle clsico SCAN/ENDSCAN bien optimizado. Cuando una optimizacin es parcial o nula, FOX seguramente crear ndices internos para mostrarnos la informacin. Dependiendo del tamao de los registros requeridos, eso puede ser una penalizacin importante. Crear una consulta SQL la puede crear cualquiera. Hacerla optimizada, requiere de cierta prctica y una buena batera de pruebas. Existe infinidad de documentacin al respecto en Internet, que recomiendo sea consultada.

Optimizando el Rushmore
Por Jaime Ferrer

Una de las caractersticas ms alabadas de Visual Foxpro es su velocidad realizando consultas en sus tablas nativas. La tecnologa que lo hace posible fue llamada Rushmore y es ampliamente aprovechada por todos los programadores VFP. Bsicamente consiste en que VFP utiliza de forma transparente los ndices para filtrar y combinar ms rpidamente las tablas que intervienen en una operacin. Tan efectivo es que alguna vez he ledo que una de las razones por las que Microsoft compro el VFP fue para poder implementar esta tecnologa en SQLServer. Sin embargo, todos sabemos que un SELECT nunca es bastante rpido, y muchas veces quedamos decepcionados cuando vemos que, a pesar de haber creado ndices en todos los campos y expresiones que intervienen en la consulta, sta an se demora unos interminables segundos, si es que no son minutos. Afortunadamente, a menudo el problema viene del mismo Rushmore y se soluciona fcilmente. Vamos a poner un ejemplo. He creado una base de datos y le he aadido tres tablas con las siguientes instrucciones:
CREATE TABLE maestro1 (m1_clave I, m1_tipo N(1)) CREATE TABLE maestro2 (m2_clave I, m2_tipo I) INDEX ON m2_clave TAG CLAVE INDEX ON m2_tipo TAG TIPO CREATE TABLE transacciones (tra_clave1 N(1), tra_clave2 I) INDEX ON tra_clave1 TAG CLAVE1 INDEX ON tra_clave2 TAG CLAVE2

La tabla maestro1 la he rellenado con 9 registros, en tres grupos de tres con tipos 1, 2 y 3, es decir, existen tres registros de cada tipo. Esta tabla no tiene ningn ndice, pues al ser tan pequea no es necesario. La tabla maestro2 contiene 100.000 registros y el rango de tipos va de 1 a 999 distribuidos aleatoriamente. La tabla transacciones contiene 2.000.000 de registros y sus campos se han rellenado aleatoriamente con las claves de los maestros correspondientes. Cogemos la tabla maestro2 y cambiamos el tipo de 4 registros a 1000. Ponemos el SET DELETED OFF Bien, ya tenemos los datos preparados para la prueba. Primer intento, probemos con:
SELECT COUNT(*) FROM transacciones; JOIN maestro1 ON tra_clave1=m1_clave; JOIN maestro2 ON tra_clave2=m2_clave; WHERE m1_tipo=2 AND m2_tipo=1000

En teora existen ndices para todos los campos involucrados en la consulta, menos para m1_clave. La primera vez que ejecuto el SELECT me tarda 48 segundos, la segunda vez, con los buffers ya llenos, me tarda slo 4, todo ello para darme un resultado de 34 registros contados. Utilizo un Pentium IV a 1.7 Gh con Windows XP y estoy accediendo a los datos del servidor Windows 2000 por una red de 10Mb/seg.

Bien, me esperaba algo mejor. Si activamos SYS(3054, 11) el informe de optimizacin nos dice: Nivel de optimizacin Rushmore para tabla transacciones: nada Nivel de optimizacin Rushmore para tabla maestro1: nada Utilizando ndice etiqueta Tipo para optimizar con Rushmore tabla maestro2 Nivel de optimizacin Rushmore para tabla maestro2:completo Combinando tabla maestro1 y tabla transacciones utilizando ndice etiqueta Clave1 Combinando tabla maestro2 y resultado intermedio con ndice temporal Esto no es lo que nosotros hubisemos hecho a mano. Vemos que Rushmore ha combinado primero las transacciones con el maestro1. Dado que la tercera parte de registros esta asociado a un registro del maestro1 con tipo 2, esto nos da un resultado intermedio de aproximadamente 2.000.000/3=666.666 registros. Si se hubiese combinado primero la tabla de transacciones con el maestro2, el primer resultado intermedio hubiera dado, en mi caso, de slo 98. Por tanto hemos de encontrar la manera de decirle al fox que combine las tablas en el orden adecuado. Probemos cambiando el orden de los JOIN y, por si acaso, el orden de las condiciones en el WHERE. SELECT COUNT(*) FROM transacciones; JOIN maestro2 ON tra_clave2=m2_clave; JOIN maestro1 ON tra_clave1=m1_clave; WHERE m2_tipo=1000 AND m1_tipo=2

Ni caso, nos hace exactamente lo mismo que en el caso anterior. Es una caracterstica del Rushmore, l escoge el orden que le parece ms apropiado, a menos que pongamos la clusula FORCE. Vamos a intentarlo otra vez. SELECT COUNT(*) FROM FORCE transacciones; JOIN maestro2 ON tra_clave2=m2_clave; JOIN maestro1 ON tra_clave1=m1_clave; WHERE m2_tipo=1000 AND m1_tipo=2 Esto me tarda unos 25 segundos la primera vez, pero 12 segundos la segunda y sucesivas. Veamos lo que me cuenta el Rushmore Nivel de optimizacin Rushmore para tabla transacciones: nada Nivel de optimizacin Rushmore para tabla maestro2: nada Combinando tabla transacciones y tabla maestro2 utilizando ndice etiqueta Clave Nivel de optimizacin Rushmore para resultado intermedio: nada Nivel de optimizacin Rushmore para tabla maestro1: nada Combinando resultado intermedio y tabla maestro1 con ndice temporal Hemos conseguido que nos combine primero la tabla transacciones con maestro2, pero el mtodo que utiliza no es el que queremos. En primer lugar no optimiza el filtro en la tabla maestro2, cuando s que existe un ndice para maestro2.m2_tipo y, adems, en las pruebas anteriores nos lo estaba utilizando. En segundo lugar vemos que para combinar la tabla transacciones con maestro2 esta utilizando el ndice Clave de maestro2 en vez del Clave2 de transacciones. Bien, probmoslo al revs:

SELECT COUNT(*) FROM FORCE maestro2; JOIN transacciones ON tra_clave2=m2_clave; JOIN maestro1 ON tra_clave1=m1_clave; WHERE m2_tipo=1000 AND m1_tipo=2 Esto nos da unos decepcionantes 50 segundos el primer intento y 6 en el segundo. El informe del Rushmore da: Nivel de optimizacin Rushmore para tabla maestro2: nada Nivel de optimizacin Rushmore para tabla transacciones: nada Combinando tabla maestro2 y tabla transacciones utilizando ndice etiqueta Clave2 Nivel de optimizacin Rushmore para resultado intermedio: nada Nivel de optimizacin Rushmore para tabla maestro1: nada Combinando resultado intermedio y tabla maestro1 con ndice temporal Hemos conseguido que nos combine maestro2 y transacciones por el ndice Clave2, pero no conseguimos que optimice el filtro de maestro2. Probemos un ltimo intento desesperado: SELECT COUNT(*) FROM FORCE maestro2; JOIN transacciones ON tra_clave2=m2_clave AND m2_tipo=1000; JOIN maestro1 ON tra_clave1=m1_clave; WHERE m1_tipo=2 EUREKA, 0 segundos y 0 segundos (las centsimas no importan), el informe de Rushmore ahora s es el que yo quiero: Utilizando ndice etiqueta Tipo para optimizar con Rushmore tabla maestro2

Nivel de optimizacin Rushmore para tabla maestro2: completo Nivel de optimizacin Rushmore para tabla transacciones: nada Combinando tabla maestro2 y tabla transacciones utilizando ndice etiqueta Clave2 Nivel de optimizacin Rushmore para resultado intermedio: nada Nivel de optimizacin Rushmore para tabla maestro1: nada Combinando resultado intermedio y tabla maestro1 con ndice temporal Qu conclusiones podemos sacar de todo esto? La primera es saber cmo decide el Rushmore el orden de combinaciones si no ponemos la clusula FORCE. En nuestro ejemplo VFP detecta que hay 3 registros de maestro1 que cumplen las condiciones del WHERE por 4 de maestro2. VFP supone, y supone mal, que ser ms eficiente combinar primero maestro1 con transacciones al tener slo 3 registros en un lado de la combinacin. De hecho, si en vez de cambiar 4 registros de la tabla maestro2 al tipo 1000, hubisemos cambiado slo 2, la consulta nos la habra optimizado bien desde un principio ya que el Rushmore habra combinado primero maestro2. La segunda y ms sorprendente, (o cmo mnimo yo no le he encontrado explicacin), es que hay veces que no optimiza las condiciones que ponemos en el WHERE, en cambio s las optimiza si las ponemos en el JOIN. Es importante, pues, que cuando diseemos un SELECT con varias tablas, nos lo pensemos dos veces cmo mnimo, hagamos pruebas con datos reales y reflexionemos sobre las condiciones de filtrado que ms les interesarn a los usuarios. Si en el sencillo caso aqu expuesto hemos obtenido una ganancia de varios miles por ciento, qu mejoras no podremos obtener optimizando nuestras SELECT en aplicaciones reales?

acelerar funcionamiento
Hola, que tal necesito ayuda para acelerar la velocidad de funcionamiento (desde los clientes) de una aplicacion que es utilizada por 2 clientes y la PC que hace de servidora de la aplicacion. Les cuento que cuando se ejecuta una consulta por ejemplo, y se tiene refrescar en un grid, se demora unos segundos, y me gustaria que sea mas rapido el refresco de esa grilla por ejemplo. Lei que se puede trabajar con el archivo config.fpw, e instalarlo en cada cliente, con este linea tmpfiles=c:temp. Pero adonde copio ese archivo config ? me pueden explicar esa forma u otra de acelerar a los clientes, por favor ? la aplicacion es accedida desde las pc clientes mediante un acceso directo a la pc servidora de la aplicacion. Muchas gracias Diego

Diego
14 de Enero del 2005

RESPONDER

Andres Hdez
14 de Enero del 2005

Puedes controlar eso con un control Timer, especifica el tiempo que te paresca prudente para que refresque y en el evento timer escribe: Thisform.Grid1.Refresh y problema resuelto Salu2
RESPONDER

juan fernando
14 de Enero del 2005

el motor de sql de vfp es uno de los mejores del mercado ya que se acerca a la teoria del algebra relacional que es la base del sql por lo tanto como consejo para la aceleracion deberias de tener en cuenta ciertos aspectos 1-al comparar dos campos en la consulta que el campo de la izquierda osea el primero sea de la tabla principal eso acelera tremedendamente la consulta 2- que las tablas que participan en la consulta se ecnuentran previamente abiertas el motor gasta menos en buscar la tabla desde la base de datos si la ponemos a disposicion es mas rapido. 3- archivos temporales cuando ejecutas tu aplicacion vfp crea temporales para todo mantener una imagen , uni indice , un cursor esos temporales los lanza en la carpeta temporal de windows del equipo servidor si trabajas en red imaginate el trafico de red que esto origina mientras la estacion va al servidor por esos temporales es superlentisimo , en el config.fpw que es un archivo de configuracion que se encuentra en la carpeta de vfp si no existe crealo es un txt con extensiuon fpw alli debes digitar la ruta de esos temporales de la siguiente forma TMPFILES=c:temporales EDITWORK=c:temporales PROGWORK=c:temporales SORTWORK =c:temporales donde temporales es una carpeta que crees en la estacion de trabajo para eliminar ese trafico de red. 3- desoues de ejecutar una consulta vfp gasta demasiada memoria se debe testear la memoria despues de ejecutar esa consulta con la funcion sys(1104) 4-las dll de inicio de tu aplicacion colocas en la carpeta desde

donde arranca tu programa y no en el sistem de windows ahorraras trafico y tiempo a tu programa buscando esas librerias primero porque al iniciar la aplicacion el sistema busca las dll en : 1-la carpeta donse arranca elm programa 2- system de windows es mejor si las encuentra de una vez y no que vaya a buscarla en el system todavia existen muhcos mas trucos para lograr mayor rapidez en una consulta... lee la ayuda espero que te sirva . jfc Hola, quisiera saber cual es la mejor manera para optimizar los tiempos en una consulta sql, utilizando la base de datos de vfp 6.0, muchas gracias.

Alex Feldstein hace 9 aos


On Tue, 29 Jun 2004 06:52:20 -0700, "Ezequiel"
Post by Ezequiel Hola, quisiera saber cual es la mejor manera para optimizar los tiempos en una consulta sql, utilizando la base de datos de vfp 6.0, muchas gracias.

La mejor manera? Utilizando Rushmore. Ver: Funcion SYS(3054,1) en la ayuda. http://fox.wikis.com/wc.dll?Wiki~RushMore http://fox.wikis.com/wc.dll?Wiki~NonDiscriminatingIndex http://fox.wikis.com/wc.dll?Wiki~UnderstandingRushmore http://fox.wikis.com/wc.dll?Wiki~NonMachineCollation UT FAQ #830 UT Thread #633629 UT Message #612662 http://www.universalthread.com

Alex Feldstein ________________________________ Microsoft Visual FoxPro MVP Please respond in the public groups so that everybody can benefit from the exchange. Favor de responder en los foros pblicos asi todos se benefician. (Address scrambled with ROT-13)

Esparta Palma hace 9 aos


Lo mejor es simplemente revisar bien cmo estn tus consultas y sobre eso, establecer los ndices correspondientes, te recomiendo *AMPLIAMENTE* el siguiente documento: --- Visual FoxPro y la optimizacin Rushmore --http://www.portalfox.com/article.php?sid=457 Espero te sirva. P.S. Como a m, la informacin que vers, te abrir los ojos en el camino a la optimizacin de las consultas... -Apoya a Visual FoxPro usndolo legalmente ,`,,`,,`,,` Espartaco Palma Martnez SysOp PortalFox ( http://www.PortalFox.com ) email: ***@portalfox.com Acapulco, Guerrero. Mxico --Post by Ezequiel Hola, quisiera saber cual es la mejor manera para optimizar los tiempos en una consulta sql, utilizando la base de datos de vfp 6.0, muchas gracias.

Ricardo Passians hace 9 aos


Post by Esparta Palma Lo mejor es simplemente revisar bien cmo estn tus consultas y sobre eso, establecer los ndices correspondientes, te recomiendo --- Visual FoxPro y la optimizacin Rushmore --http://www.portalfox.com/article.php?sid=457 Espero te sirva. P.S. Como a m, la informacin que vers, te abrir los ojos en el camino a la optimizacin de las consultas...

Puede ser, pero a mi no dej de confundirme un poco sobre todo con el asunto de tener un TAG por deleted(). Antes se deca que era muy necesario pero segn ese artculo parece que no es as. Confusin.

Esparta Palma hace 9 aos


En su momento me qued claro, el poner un TAG por DELETED() slo servira en cuanto tu ndice de elementos borrados se incremente, cuando no hay borrados (lgicos) entonces slo es una sobrecarga innecesaria, tambin lo llev a cabo y vi un comportamiento similar, ahora mismo ya no puedo volver a comprobar debido a que no tengo sistemas con DBFs.
Post by Esparta Palma Lo mejor es simplemente revisar bien cmo estn tus consultas y sobre eso, establecer los ndices correspondientes, te recomiendo --- Visual FoxPro y la optimizacin Rushmore ---

http://www.portalfox.com/article.php?sid=457 Espero te sirva. P.S. Como a m, la informacin que vers, te abrir los ojos en el camino a la optimizacin de las consultas... Puede ser, pero a mi no dej de confundirme un poco sobre todo con el asunto de tener un TAG por deleted(). Antes se deca que era muy necesario pero segn ese artculo parece que no es as. Confusin.

,`,,`,,`,,` Espartaco Palma Martnez SysOp PortalFox.com email:mexicoSINSPAM[Arroba]portalfox.com ---------------------------------------------PortalFox :: Nada corre como un zorr http://www.portalfox.co PortalFox - NNTP Forum Gatewa -----------------------------------------------

Hector Quiones hace 9 aos


El articulo esta claro en ese aspecto, lo esta demostrando con cifras y eso cuenta. Lo que si me desconcerto es que el principal fin de los indices es la optimizacion de el acceso a los datos, al programar con tablas .dbf utilizo los indices para; relaciones, busquedas rapidas (seek()), o equiste otra forma de relacionar sin indices. Estoy pasando mi aplicacion para trabajar con SQL, y gracias al apoyo del foro puedo decir que voy por buencamino, pero tengo algunas dudas y estan relacionadas al tem: 1. Los indices en SQL, tambien me sirven para esta optimizacion. 2. Las relaciones en SQL se pueden traer a las consultas, o solo estan para controlar la integridad relacional. Gracias por su tiempo y apoyo Hector

----------------------------------------------PortalFox :: Nada corre como un zorro http://www.portalfox.com PortalFox - NNTP Forum Gateway -----------------------------------------------

Esparta Palma hace 9 aos


Con "SQL" te refieres a un servidor de base de datos, no es as? Si es as

Post by Hector Quiones 1. Los indices en SQL, tambien me sirven para esta optimizacion.

No, no te sirven, ya que el trabajo lo realiza el servidor, a t nicamente se te entregan los conjuntos de datos ordenados segn lo indicas. El cmo maneje sus ndices el servidor, pues ser su problema de "Tunning", es decir, depender de cada servidor, obviamente el tener tus ndices correctablemente establecidos siempre ayudar.
Post by Hector Quiones 2. Las relaciones en SQL se pueden traer a las consultas, o solo estan para controlar la integridad relacional.

Slo estn para controlar la integridad referencial. Y los triggers.


Post by Hector Quiones El articulo esta claro en ese aspecto, lo esta demostrando con cifras y eso cuenta. Lo que si me desconcerto es que el principal fin de los indices es la optimizacion de el acceso a los datos, al programar con tablas .dbf utilizo los indices para; relaciones, busquedas rapidas (seek()), o equiste otra forma de relacionar sin indices. Estoy pasando mi aplicacion para trabajar con SQL, y gracias al apoyo del foro puedo decir que voy por buencamino, pero tengo algunas dudas y estan 1. Los indices en SQL, tambien me sirven para esta optimizacion. 2. Las relaciones en SQL se pueden traer a las consultas, o solo estan para controlar la integridad relacional. Gracias por su tiempo y apoyo Hector

,`,,`,,`,,` Espartaco Palma Martnez SysOp PortalFox.com email:mexicoSINSPAM[Arroba]portalfox.com ---------------------------------------------PortalFox :: Nada corre como un zorr http://www.portalfox.co PortalFox - NNTP Forum Gatewa -----------------------------------------------

Ricardo Passians hace 9 aos


Post by Hector Quiones El articulo esta claro en ese aspecto, lo esta demostrando con cifras y eso cuenta.

Mejor decir: "Est claro para m" porque para otros como yo sigue sin estarlo. Ok.. habla de cifras pero al disear una base de datos cmo yo s a priori cul va a ser el comportamiento de los registros borrados en determinada tabla (por ej. una de documentos contables) ? Habra que esperar un buen tiempo para entonces decidir si crear o no dicho tag basado en los datos reales. Lo que quiero decir es (en ese punto del tag deleted()) que el artculo no me ayuda mucho a decidir cuando poner desde un principio un tag deleted(), al contrario me confunde. La decisin no deja de ser mera estimacin mientras tanto.

Contadores para Rendimiento de SQL Server


Personas que lo han encontrado til: 41 de 42 - Valorar este tema Por Alberto Lpez Grande

Contenido
Contadores para Rendimiento de SQL Server 1. Introduccin 2. Qu son los Contadores? 3. Cmo poner Contadores? 4. reas de Medicin 5. Memoria 6. Procesador 7. Disco 8. Red 9. SQL Server 10. Conclusin

Contadores para Rendimiento de SQL Server


Principio de la pgina

1. Introduccin
Una de las funciones indispensables de la administracin es la monitorizacin del rendimiento de los servidores de bases de datos. Entre otras cosas, para eso estn los contadores de rendimiento, que dan medida de numerosos parmetros. Existen muchsimos contadores que permiten la monitorizacin, tanto del sistema operativo como propios de SQL Server. Iniciarse en su conocimiento y utilizacin no siempre es sencillo y no slo eso: si sabemos cules tenemos que poner y cmo, su interpretacin tampoco es trivial. Qu contadores son los ms relevantes? Qu tengo que medir? Qu valores de referencia indican que la cosa va bien o va mal? Estas son algunas de las preguntas que este artculo pretende responder, dando una visin introductoria para aqul que se enfrenta por primera vez a este problema. Con el tiempo, en base a la profundizacin de estos temas, el conocimiento de las particularidades de cada entorno y el problema que se puede estar teniendo en ese momento, cada cual opta por unos u otros, con lo que se terminara aadiendo y/o quitando contadores. Lo que aqu se ofrece es un conjunto contadores, intentando siempre observar la generalidad. Principio de la pgina

2. Qu son los Contadores?


A continuacin un breve repaso sobre la forma en la que se colocan los contadores, cmo se instalan y algo acerca de su nomenclatura. Un contador, en general, es una medida de un parmetro determinado. Cada contador pertenece a un objeto. Por objeto, se entiende un mbito de medicin, existiendo muchos de estos objetos. Cada objeto tiene uno o ms contadores y es necesario que se instale o active el objeto para que podamos recoger los datos de sus contadores. Hay objetos que se instalan con el sistema operativo, como el objeto System; otros hay que

instalarlos, como los de red; y otros los instalan las aplicaciones, como los de SQL Server (es una opcin habilitada por defecto en el setup, siendo ms que recomendable su inclusin). Tambin hay contadores que slo estn disponibles bajo determinadas circunstancias, como que un servicio concreto est arrancado o se est realizando un backup. Por ltimo, existen contadores que permiten la medicin de diferentes instancias o partes concretas o del total de las mismas. Por ejemplo, si tenemos varias CPU, podemos medir la actividad de cada una de ellas de forma independiente o tomar una media. Otro ejemplo son los contadores que miden el nmero de transacciones, que permiten recoger el nmero de transacciones de cada base de datos independientemente. El Figura 1 muestra el formulario que permite aadir contadores en Performance Monitor, donde se pueden ver estos tres conceptos: Objeto, Contador e Instancia:

Figura 1. Volver al texto. Principio de la pgina

3. Cmo poner Contadores?


El sistema operativo cuenta con una herramienta denominada Performance Monitor (Ir a Inicio | Ejecutar | "perfmon"): una interfaz para acceder a los objetos y sus contadores. Esta herramienta permite ver los contadores "en directo". Sin embargo, la forma ms saludable es arrancar los contadores, acumular datos y luego estudiarlos con calma. Lo normal es realizar una captura cada cierta cantidad de minutos (1, 2 5) de muchos contadores. Esto nos permitir realizar estudios de tendencias, identificar picos y valles de carga durante el da y, sobre todo, no tener que poner contadores cuando se reporte un problema de rendimiento, momento en el que quizs ya sea demasiado tarde. Para ello existen herramientas en el mercado que te permitirn recolectar estos datos, tales como NetIQ, etc. Windows tambin tiene su propia herramienta de registro y alertas de rendimiento (as se llama este servicio), al cual se puede acceder desde la Administracin de equipos. Se pueden configurar un conjunto de contadores, una frecuencia de los mismos, un

formato de salida para los datos y luego empezar a recoger datos. El formato de los datos puede ser binario, texto plano e incluso pueden almacenarse en una base de datos, a travs de un DNS. Esto nos abre un enorme abanico de posibilidades cuando pasemos a explotar la informacin recogida. Podemos contar tambin con Performance Monitor, pero tambin con Excel e incluso, si la cantidad de informacin es grande, podemos preparar un cubo OLAP para procesarlo todo. En ambos casos, ya sea en directo o acumulando datos, no es bueno recoger estos datos desde el propio servidor que se desea monitorizar. Esto no es slo por la alteracin en los datos recogidos por la toma de los propios contadores, sino por el impacto en el rendimiento general que podemos causar. Si no se dispone de un equipo dedicado exclusivamente a la monitorizacin de la infraestructura, se puede recurrir a cualquier otro equipo que tengamos cerca. Usar el propio nodo en el que en ese momento est el servidor de bases de datos para estos fines debe ser siempre el ltimo recurso. Principio de la pgina

4. reas de Medicin
Una de las Leyes de Murphy dice: "Todo lo que puede ir mal, ir mal". Y es cierto, por lo que debemos monitorizarlo todo de una forma u otra. Sea lo que fuere que vayamos a vigilar mediante el uso de contadores de rendimiento, aqu vamos a dividirlo en cuatro grandes reas, a nivel de hardware (memoria, procesador, red y disco), con un quinto apartado para localizar problemas propios de los desarrollos y particularidades del sistema a estudiar, que sern sobre todo contadores de objetos propios de SQL Server (estos, en muchos casos, servirn de apoyo o ayuda para la monitorizacin de las reas anteriores). El objetivo es poder identificar cuellos de botella, es decir, dnde est principalmente el problema. Otro asunto ser ver cmo salvamos ese cuello de botella. Si los contadores nos demuestran un problema de memoria, la conclusin inmediata no deber ser aadir memoria al servidor. Si tenemos un proceso que se come los recursos, y solo aumentamos los recursos (sin mejorar ese proceso), es posible que tres meses despus de realizada la inversin, nos encontremos con que nuevamente se nos ha presentado el problema en el servidor, quedando adems en una posicin difcil de explicar. Pedir ms hardware es reconocer que no somos capaces de hacer mejor nuestro trabajo, que entre otras cosas es sacarle el mximo partido a los recursos con los que contamos. As que cuando lo pidamos, que sea porque ya hemos revisado a conciencia todo lo dems y hemos comprobado que el coste de mejorar el desarrollo o ese diseo est sobradamente por encima del coste en hardware. Y cuando llegue ese momento, los datos recogidos de los diferentes contadores sern un punto de apoyo muy bueno para justificar la adecuacin de la infraestructura. Es necesario puntualizar, por ltimo, que aunque lo queramos dividir en reas, todas estas reas estn bastante relacionadas. Un problema de contencin de disco suele repercutir en la CPU y puede estar causado por una mala gestin de la memoria y, finalmente, saturar la red. Es muy importante tener en cuenta estas interrelaciones a la hora de realizar un diagnstico certero que nos permita localizar el origen (o los orgenes) del dficit de rendimiento. Principio de la pgina

5. Memoria
El correcto uso de la memoria es lo que nos brindar un servidor ms gil en su respuesta, es decir, lo que va a significar que el usuario no diga la frase ms temida: "La base de datos va muy lenta". SQL Server debe tener suficiente memoria disponible como para emplear un poco ms si le hace falta (aunque por norma general ya la acapara casi en su totalidad), pero a la vez debe ocupar la suficiente memoria como para evitar que las operaciones se realicen contra el disco fsico. Si la

mejor consulta es aquella que no se realiza, la segunda mejor es aquella que se realiza contra la cach. Son esos dos aspectos, que haya memoria disponible y que se explote la cach al mximo, los que monitorizaremos en esta rea: Memory: Pages/sec. Indica el nmero de pginas que entran y salen de la cach en cada segundo. Su valor debe situarse muy cercano a 0. Si es mayor a 20 de forma continuada, tal vez no tengamos un problema de rendimiento; pero lo que es seguro es que la memoria no est siendo gestionada adecuadamente. Memory: Availability Mb ( Kb Bytes , lo que ms cmodo resulte). En general, debemos contar con 5 Mb de memoria libres (y disponibles) como mnimo. SQL Server: Memory Manager: Total Server Memory y Target Server Memory . Estos dos contadores del mismo objeto nos dicen el total de memoria que tenemos y la memoria que necesitamos. "Total" debe ser igual que "Target". Si esto no es as, y "Total" es menor que "Target", es un indicio claro de un problema en la memoria, ya que tenemos menos de la que necesitamos. Principio de la pgina

6. Procesador
El uso del procesador es un punto bsico para la monitorizacin de cualquier servidor, sea o no de base de datos. Dentro de los que hay, nos concentraremos en dos de ellos: el porcentaje de uso y la cola del procesador, ms un tercero que permita conocer qu parte del pastel se come el sistema operativo. Cuanto menor sea la utilizacin de las CPU que tengamos, mejor. Este uso comienza a ser un problema cuando de forma sostenida se sobrepasa el 80%. Y para solventarlos, antes de pensar en aadir ms procesadores y/o cambiarlos por otros ms veloces o tecnolgicamente ms avanzados, es preciso revisar las recompilaciones y los planes de ejecucin de las consultas, entre otras cosas. Luego, para monitorizar la CPU podemos optar por los siguientes contadores: Processor: % CPU Usage (instancia _Total si se cuenta con ms de un procesador y si todos ellos estn desempeando el mismo rol): Mantener por debajo del 80%. System: Processor queue length. Es la cola de procesador, debe permanecer por debajo de 2 por CPU. Si estos dos contadores estn por encima de lo normal, podemos fijarnos en un par de ellos ms para afinar el diagnstico. Uno es System: Context Switches/sec (slo en caso de tener ms de una CPU). Este contador indica las veces en las que un mismo proceso, medianamente pesado, cambia de procesador para completarse. El cambio tiene lugar por cuestiones de balanceo de carga y aunque puede forzarse a que no se efecte (con option maxdop, por ejemplo), lo ms lgico es dejar que sea el servidor el que gestione estos saltos. Pero cada movimiento tiene un coste y ese coste puede verse reducido si configuramos el servidor para que use fibras (que se pueden definir como conjuntos de hilos o hilos gruesos), que suavizan de forma considerable el coste del cambio entre procesadores. Si este contador se sita por encima de 8000, es momento de pensar en modificar esta configuracin. El otro contador que puede aportarnos informacin adicional es System: % Total Privileged Time; ste indica qu porcentaje de tiempo se dedica a tareas del sistema operativo. Si est por encima del 20%, es posible que el problema no est en el procesador, sino en el disco. Para ello, verificar si el contador PhysicalDisk: % Disk Time(del que hablaremos ms adelante en el apartado de disco) est por encima del 55%. Principio de la pgina

7. Disco

El disco es el punto en el que ms frecuentemente se localizan los cuellos de botella, as como la causa final de los problemas de otras reas. Discos potentes y rpidos (ya sea pinchados en el servidor o en una cabina de discos), una configuracin en el RAID adecuada que asegure la disponibilidad, y una ubicacin correcta de los ficheros en los diferentes grupos de discos (datos y log separados, con discos independientes tambin para tempdb) es la clave para que nuestros servidores rindan a plena potencia. An con todo esto, pueden presentarse problemas de contencin, que con una adecuada monitorizacin detectaremos; es ms, la monitorizacin nos dar pistas para paliar la situacin. As, adems de saber si cada conjunto de discos va bien o mal, podremos determinar si el problema est en las lecturas o en las escrituras, si cambiar el fill factor de los ndices ayudara, etc. Para poder observar los contadores de disco fsico, es necesario que stos estn activos. A partir del sistema operativo Windows 2000, los contadores estn activados por defecto. Si esto no es as, es necesaria la ejecucin dediskperf -y en una ventana de comandos del sistema, as como tambin el reinicio del sistema, para que los podamos colocar. El contador ms relevante quiz sea la cola de disco, ya sea la media o la actual. Si durante perodos prolongados (ms de 10 minutos) se mantiene por encima de 2, se puede decir que existe un problema, aunque teniendo en cuenta dos detalles importantes: primero, el contador funciona a nivel lgico, es decir, por unidades. Si por ejemplo tenemos una unidad en RAID 5 compuesta por 5 discos, tendremos que dividir el valor del contador entre 5; y segundo, hay que ser un poco permisivos, por sentido comn, con determinados procesos, sean o no de mantenimiento. La realizacin de backup y las reindexaciones son operaciones que exprimen intensamente el disco. Es totalmente normal que las colas de disco se disparen, sin que por ello tengamos que perder la cabeza. Asimismo, si tenemos un DTS que realiza la actualizacin del diario o la actualizacin de los datos para un cubo OLAP, por ejemplo, hay que ser conciente de ello y esperar una cola de disco realmente alta mientras dure el proceso. La forma de proceder ser encontrar un momento de baja carga para la ejecucin de estos procesos, como durante las noches o los fines de semana. Tampoco significa esto que no podamos optimizar todos estos procesos, slo que no pueden ser medidos por el mismo rasero. Los contadores para el disco: PhysicalDisk: Avg. Disk Queue Length. Debe estar por debajo de 2 en cada unidad (tras ponderar el nmero de discos del RAID, si procede). La instancia comn puede sernos de ayuda para calibrar el estado general. PhysicalDisk: % Disk Time. Indica qu porcentaje de tiempo se emplea en el disco. Si est por encima del 55%, puede que haya un problema, habra que mirar tambin PhysicalDisk: Disk Read Time y PhysicalDisk: Disk Write Time para ver si hay un importante desequilibrio no esperado entre las lecturas y las escrituras, que podra regularse variando el fill factor de los ndices (si estamos hablando de una base de datos de slo lectura o eminentemente de lectura, es lgico que haya un desequilibrio). Si las lecturas estn muy por encima de las escrituras, el fill factor puede que sea muy alto. Si es al contrario y las escrituras llevan la mayor parte del peso, aumentar el fill factor podra paliar el problema. Es ms una cuestin de afinar y probar hasta encontrar un equilibrio. Principio de la pgina

8. Red
Los objetos que nos permiten colocar contadores de red, los que empiezan por Network, se instalan como un componente de Windows (en estos sistemas operativos), concretamente en el llamado Herramientas de administracin y supervisin.

La red casi nunca supone un cuello de botella, pero es imposible no tenerla en cuenta, ya que los datos van y vienen por aqu. Lo que no es tan infrecuente es que se produzcan cortes en la comunicacin, que pueden ser detectados por mtodos tan simples como poniendo una estadstica de ping (con paquetes ligeros). La aplicacin de las normas ms bsicas de la tecnologa clienteservidor nos aportan la mejor forma de optimizar el uso de la red. Es decir, enviar slo aquello que el cliente pide e impedir que el cliente pida ms de lo que necesita (con una correcta paginacin, parmetros limitados en los reports, bsquedas controladas, etc.). An as, nuestra red debe estar dimensionada acorde con lo que se le va a exigir, para lo cual contamos con la ayuda de los siguientes contadores: Network Interface: Bytes Total/sec. Depende esencialmente de la red, con lo que es difcil dar una cifra que pueda ser usada de forma general. Se puede aplicar una sencilla regla, en combinacin con el contadorCurrent Bandwidth, del mismo objeto. Bytes Total/sec dividido entre Current Bandwidth debe ser menor que 6. Network Segment: % Network Utilization. Permite verificar el uso de cada tarjeta de red que podamos tener en el servidor. Server: Bytes Received/sec y Server: Bytes Transmitted/sec. Permite comprobar si es el servidor de base de datos el que est saturando la red, perjudicando sus otros usos. SQLServer: SQL Statistics: Batch Request/sec. Una tarjeta de red de 100Mbs soporta, aproximadamente, unos 3000 comandos por segundo. Si este contador est por encima, se precisa una segunda tarjeta o una de mayor capacidad. Principio de la pgina

9. SQL Server
Casi todos los contadores mencionados hasta ahora son del sistema operativo. SQL Server posee un importante nmero de objetos, con sus contadores, que permiten monitorizar con el detalle que uno desee un servidor, y ms concretamente los desarrollos o peculiaridades que corren en l. Tenemos objetos para SQL Server Agent, replicacin, cursores, bloqueos, memoria y cach, conexiones, paginacin, backup, etc. No hay ms que ir al monitor de rendimiento y en la lista de objetos ver todos los que empiezan con SQLServer. Aqu se citarn algunos de ellos, los ms generales quizs. Pero en funcin del uso que tengamos en cada servidor deberemos ampliar o cambiar los contadores a seguir. Y si en general lo de los contadores es una cuestin de gusto o comodidad, ya que se puede medir lo mismo con varios contadores en casi todos los casos, en el caso de los contadores propios de SQL Server, en los que tenemos ms variedad, ms an si cabe. Los siguientes son algunos de los contadores de uso ms extendido, intentando hacer un barrido por lo ms significativo para conseguir una monitorizacin bsica: SQLServer: Access Methods: Page split/sec. Si est por encima de 100, viene acompaado de problemas de disco. Un aumento en el fill factor puede resolver la situacin. SQLServer: Buffer Manager: Cache Hit Ratio. Indica el porcentaje de veces que el motor usa la cach frente al disco. Es un valor medio desde el ltimo reinicio. Este valor debe permanecer por encima del 99%, casi en 100, para servidores OLTP. En servidores OLAP, debe estar por encima del 80%. Los siguientes 5 contadores sirven para afinar problemas de cach y memoria: SQLServer: Buffer Manager: Page Life Expectancy. Tiempo en segundos que permanece una pgina en memoria sin tener ninguna referencia que la retenga all. Cuanto ms tiempo, mejor. Un valor de referencia, por encima de 300, es decir 5 minutos. SQLServer: Buffer Manager: Lazy Write/sec. Pginas que salen de la cach por segundo. Al contrario que el anterior, cuanto ms alto, peor. Por debajo de 20.

SQLServer: Buffer Manager: Checkpoint Pages/sec. Un checkpoint obliga a bajar a disco todas las pginas que se tengan en memoria. Slo debe ejecutarse en determinadas circunstancias, la mayora de ellas, tareas administrativas, por lo que si se ejecuta con mucha frecuencia, estaremos mal utilizando la memoria. SQLServer: Buffer Manager: Procedure Cache Pages. Este contador indica las pginas de memoria dedicadas a almacenar planes de ejecucin de procedimientos almacenados. Un descenso brusco en este contador puede venir acompaado de un descenso del rendimiento, causado por la recompilacin de procedimientos almacenados. SQLServer: Databases: Log Flushes/sec. Indica las veces por segundo que las pginas pasan de cach al fichero de log. Funciona muy en paralelo al nmero de transacciones, y como el nmero de transacciones, cuanto menor sea, mayor rendimiento. Para tener una idea del nmero de usuarios que manejamos, los siguientes 3 contadores son muy tiles: SQLServer: General Statistics: User connections. Indica el nmero de conexiones. Sirve para saber identificar horas de alta y baja actividad y para saber si un pico en otras reas puede estar relacionado con un mayor nmero de usuarios en ese momento. SQLServer: Databases: Transaction/sec. Adems de un uso similar al contador anterior, nos permite determinar qu bases de datos tienen ms carga de transacciones. Un caso a tratar de forma particular es el de tempdb, ya que es muy comn que sea sta una de las bases de datos que ms transacciones por segundo soporta. Es necesario vigilar y optimizar en lo posible este hecho. Su reduccin puede venir de muchas formas, siendo algunas tan obvias como la revisin de los procesos que usan tablas temporales, pero no slo eso, tambin hay que observar las consultas muy pesadas y complejas, que usan tempdb para completarse. SQLServer: SQL Statistics: SQL Compilations/sec . Da una idea de la carga real del servidor, en cuanto a compilaciones se refiere. Si est entorno a 100, es buena seal. Si pasa de ah, se estarn consumiendo muchos recursos en la preparacin de planes de ejecucin. Por lo general, la deteccin de bloqueos no se observa de una forma fcil con contadores, salvo que la situacin sea realmente catica. Los siguientes contadores aportan datos que si destacan, es mejor estudiar con profiler: SQLServer: Access Methods: Full scans/sec. Este contador nos da una idea de las veces en las que se realizan recorridos de ndice, mucho peor que realizacin de bsquedas en los mismos. Si arroja cifras relevantes, es mejor capturar con profiler y estudiar planes de ejecucin de las consultas con ms lecturas lgicas. SQLServer: Locks: Number of Deadlocks. El nmero de interbloqueos debe ser 0. Si se detecta alguno, hay que revisar y erradicar las sentencias que estn provocando ese problema. En ocasiones, el negocio obliga a que se den con ms frecuencia, ser cuando ms cuidado haya que tener con el nivel de aislamiento. SQLServer: Locks: Avg. Wait Time (ms). Indica la media de milisegundos que hay que esperar para la liberacin de un bloqueo. SQLServer: Latches: Average Latch Wait Time (ms) , Latch Waits/sec y Total Latch Wait Time (ms). Estos tres contadores nos hablan de los minibloqueos, es decir, bloqueos que son tan cortos que no llegan ni a serlo. Pero eso no significa que no estn ah. Un elevado nmero de latches suele venir acompaado de un importante nmero de bloqueos. As que estos contadores son de gran ayuda para anticiparse a problemas de este tipo, ya que lo que hoy son latches, en el futuro pueden ser bloqueos. La forma de gestionar estos valores es obtener una lnea base durante un periodo de tiempo que consideremos normal, y que luego usemos como referencia, para poder saber si la situacin se degrada. Si nos alejamos

de esa lnea base (por arriba), adems de la revisin de las consultas y el nivel de aislamiento, es frecuente que el problema est en la memoria o en el disco. Otros contadores, ya mencionados, nos ayudarn en este sentido. Por ltimo, un contador para medir el rendimiento de los backup. Cuando se lanza un backup, lo ms normal es que se produzca un importante pico en la cola de disco. Si contamos con varias bases de datos, es tpico lanzarlos todos a la vez (adems, justo a las doce de la noche). Podemos tener un problema de rendimiento que es preciso vigilar, que podramos evitar lanzando los backup uno a continuacin del anterior. Un contador al que podemos acudir es SQLServer: Backup Device: Device Throughput Bytes/sec. Este contador mide el rendimiento de los backup, y con una regla de tres simple tambin lo podemos usar para saber cunto nos queda para que un backup finalice, por ejemplo. Tiene la pega de que slo se puede arrancar para los backup que estn realizndose en ese momento. Pero si se dispone de una utilidad de monitorizacin es posible explotarlo sin problema. Hay que tener un poco de cuidado, porque a veces puede arrojar resultados engaosos, apareciendo lecturas cuando hay una importante actividad, generalmente relacionada con tempdb (pero no exclusivamente con ello), y no hay ningn backup en curso. Los backup del log propios de tempdb, algo interno del funcionamiento de esta base de datos, pueden ser detectados en este contador cuando existe un fuerte uso de esta base de datos (tablas temporales creadas intencionadamente o como resultado de procesos muy pesados que requieren de tablas intermedias, o worktables, para su funcionamiento). Podemos distinguirlos de los backup normales, adems de por saber que no estamos haciendo ningn backup en ese momento, porque el contador arroja picos muy breves e intensos, en lugar de valores intermedios durante periodos prolongados (lo que dure el backup). Principio de la pgina

10. Conclusin
A modo de resumen, se muestra a continuacin un cuadro con los contadores sobre los que se ha hablado, y sus valores de referencia:

ContadorValor/Uso MemoriaMemory: Pages/sec< 20 MemoriaMemory: Availability Mb> 5 Mb MemoriaSQLServer: Memory Manager: Total Server Memory vs. SQLServer: Memory Manager: Target Server MemorySi Total = Target -> Bien Si Total < Target -> Falta RAM ProcesadorProcessor: % CPU Usage< 80 % ProcesadorSystem: Processor queue length< 2 por CPU ProcesadorSystem: Context Switches/secSi es > 8000, probar Fibras ProcesadorSystem: % Total Privileged TimeSi es < 20 %, posible problema de disco DiscoPhysicalDisk: Avg. Disk Queue LengthAvg./(#Discos del RAID) < 2

DiscoPhysicalDisk: % Disk Time< 55% DiscoPhysicalDisk: Disk Read Time vs. PhysicalDisk: Disk Write TimeSi Read >> Write -> Bajar Fill Factor Si Read << Write -> Subir Fill Factor RedNetwork Interface: Bytes Total/sec vs. Network Interface: Current BandwidthBytes / Bandwidth < 6 RedNetwork Segment: % Network UtilizationComprobacin de uso de las distintas tarjetas de red RedServer: Bytes Received/sec vs. Server: Bytes Transmitted/sec.Saber si el servidor est perjudicando el resto de la red RedSQLServer: SQL Statistics: Batch Request/sec3000 por tarjeta de 100 Mbs SQL Server (General)SQLServer: Access Methods: Page split/secSi es < 100, posible problema de disco SQL Server (General)SQLServer: Buffer Manager: Cache Hit RatioEn OLTP > 99 %; en OLAP > 80 %, uso de cach SQL Server (Memoria)SQLServer: Buffer Manager: Page Life Expectancy> 300 SQL Server (Memoria)SQLServer: Buffer Manager: Lazy Write/sec< 20 SQL Server (Memoria)SQLServer: Buffer Manager: Checkpoint Pages/secNo debe aparecer con frecuencia SQL Server (Memoria)SQLServer: Buffer Manager: Procedure Cache PagesDebe permanecer constante SQL Server (Memoria)SQLServer: Databases: Log Flushes/secA menor valor, mayor rendimiento SQL Server (Usuarios)SQLServer: General Statistics: User connectionsIdentificar horas punta y horas valle de usuarios SQL Server (Usuarios)SQLServer: Databases: Transaction/secSaber qu base de datos es ms usada SQL Server (Usuarios)SQLServer: SQL Statistics: SQL Compilations/sec< 100 (si no, los planes de ejecucin estn consumiendo mucho) SQL Server (Bloqueos)SQLServer: Access Methods: Full scans/secSi es relevante, estudiar con profiler SQL Server (Bloqueos)SQLServer: Locks: Number of DeadlocksMnimo (estudiar con profiler) SQL Server (Bloqueos)SQLServer: Locks: Avg. Wait Time (ms)Mnimo posible SQL Server (Bloqueos)SQLServer: Latches: Average Latch Wait Time (ms), Latch Waits/sec y Total Latch Wait Time (ms)Establecer lnea base y observar qu se est entorno a ella SQL Server (Backup)SQLServer: Backup Device: Device Throughput Bytes/secRendimiento de backup, fuerte actividad en tempdb
Alberto Lpez Grande posee 6 aos de experiencia trabajando con diversos mbitos de SQL Server en Madrid. Cuenta con la certificacin MCP de SQL Server 2000, tanto en administracin como en diseo.

Principio de la pgina

12.9.3. Funciones de informacin


BENCHMARK(count,expr)

La funcin BENCHMARK() ejecuta la expresin expr repetidamentecount veces. Puede usarse para ver lo rpido que MySQL procesa la expresin. El valor resultado siempre es 0. El uso pretendido es desde dentro del cliente mysql, que reporte tiempos de ejecucin de consultas:
mysql> SELECT BENCHMARK(1000000,ENCODE('hello','good bye')); +---------------------------------------------+ | BENCHMARK(1000000,ENCODE('hello','good bye')) | +---------------------------------------------+ | 0 | +---------------------------------------------+ 1 row in set (4.74 sec)

El tiempo reportado es el tiempo transcurrido en el cliente final no el tiempo de CPU en el servidor. Se recomienda ejecutar BENCHMARK() varias veces, y interpretar el resultado teniendo en cuenta la carga de la mquina servidor.
CHARSET(str)

Retorna el conjunto de caracteres el argumento cadena.


mysql> SELECT CHARSET('abc'); -> 'latin1'

mysql> SELECT CHARSET(CONVERT('abc' USING utf8)); -> 'utf8' mysql> SELECT CHARSET(USER()); -> 'utf8' COERCIBILITY(str)

Retorna la coerzabilidad de la colacin del argumento.


mysql> SELECT COERCIBILITY('abc' COLLATE latin1_swedish_ci); -> 0 mysql> SELECT COERCIBILITY(USER()); -> 3 mysql> SELECT COERCIBILITY('abc'); -> 4

El valor de retorno tiene los siguientes significados:

Coerzabilidad Significado
0 1 2 3 4 5 Colacin explcita Sin colacin Colacin implcita Constante de sistema Coercible Ignorable

Ejemplo
Valor con la clusula COLLATE Concatenacin de cadenas con distintas colaciones Valor de columna Valor de retorno USER() Cadena literal NULL o una expresin derivada de NULL

Antes de MySQL 5.0.3, los valores de retorno se muestran como sigue, y las funciones tales como USER() tienen una coerzabilidad de 2:

Coerzabilidad Significado
0 1 2 3 Colacin explcita Sin colacin Colacin implcita Coercible

Ejemplo
Valor con la clusula COLLATE Concatenacin de cadenas con distintas colaciones Valor de columna Cadena literal

Los valores menores tienen precedencia mayor.


COLLATION(str)

Retorna la colacin para el conjunto de caracteres de la cadena dada.


mysql> SELECT COLLATION('abc'); -> 'latin1_swedish_ci' mysql> SELECT COLLATION(_utf8'abc');

-> 'utf8_general_ci' CONNECTION_ID()

Retorna el ID de la conexin (ID del thread) para la conexin. Cada conexin tiene su propio y nico ID.
mysql> SELECT CONNECTION_ID(); -> 23786 CURRENT_USER()

Retorna la combinacin de nombre de usuario y de equipo que tiene la sesin actual. Este valor se corresponde con la cuenta MySQL que determina sus privilegios de aceso. Puede ser distinto al valor de USER().
mysql> SELECT USER(); -> 'davida@localhost' mysql> SELECT * FROM mysql.user; ERROR 1044: Access denied for user ''@'localhost' to database 'mysql' mysql> SELECT CURRENT_USER(); -> '@localhost'

El ejemplo ilustra que aunque el cliente especica un nombre de usuario de davida (como se indica por el valor de la funcin USER() ), el servidor autentica al cliente usando una cuenta de usuario annimo (como se ve por la parte de usuario vaca del valor CURRENT_USER() ). Una forma en que esto puede ocurrir es que no haya cuenta listada en las cuentas de permisos para davida. En MySQL 5.0, la cadena retornada por CURRENT_USER() usa el conjunto de caracteres utf8 .
DATABASE()

Retorna el nombre de base de datos por defecto (actual). En MySQL 5.0, la cadena tiene el conjunto de caracteres utf8 .
mysql> SELECT DATABASE(); -> 'test'

No hay base de datos por defecto, DATABASE() retorna NULL.


FOUND_ROWS()

Un comando SELECT puede incluir una clusula LIMIT para restringir el nmero de registros que el servidor retorna al cliente. En algunos casos, es deseable saber cuntos registos habra retornado el comando sin LIMIT, pero sin volver a lanzar el comando. Para obtener este conteo de registros, incluya la opcinSQL_CALC_FOUND_ROWS en el comando SELECT , luego invoque FOUND_ROWS() :
mysql> SELECT SQL_CALC_FOUND_ROWS * FROM tbl_name -> WHERE id > 100 LIMIT 10; mysql> SELECT FOUND_ROWS();

El segundo SELECT retorna un nmero indicando cuantos registros habra retornado el primer SELECT sin la clusula LIMIT . (Si el comando precendente no incluye la opcin SQL_CALC_FOUND_ROWS , FOUND_ROWS(
)puede retornar un resultado distinto cuando se

usa LIMIT y cuando no.) Tenga en cuenta que si usa SELECT


SQL_CALC_FOUND_ROWS, MySQL debe calcular

cuntos registros hay en el conjunto de resultdos completo. Sin embargo, esto es ms rpido que ejecutar la consulta de nuevo

sin LIMIT, ya que el conjunto de resultados no necesita ser enviado al cliente.


SQL_CALC_FOUND_ROWS y FOUND_ROWS() pued

en ser tiles en situaciones donde puede querer restringir el nmero de registros que retorna una consulta, pero tambin determinar el nmero de registros en el conjunto de resultados entero sin ejecutar la consulta de nuevo. Un ejemplo es el script Web que presenta una salida paginada conteniendo enlaces a las pginas que muestran otras secciones de un resultado de bsqueda. Usando FOUND_ROWS() puede determinar cuntas pginas necesita para el resto de resultados. El uso deSQL_CALC_FOUND_ROWS y FOUND_ROWS() es ms complejo para consultas UNION que para comandosSELECT simples, ya que LIMIT puede ocurrir en varios lugares en una UNION. Puede aplicarse a comandosSELECT individuales en la UNION, o global en el resultado de UNION como conjunto. La intencin de SQL_CALC_FOUND_ROWS para UNION es que debe retornar el nmero de registros que se retornaran sin un LIMIT globar. Las condiciones para uso de SQL_CALC_FOUND_ROWS con UNION son:

La palabra clave SQL_CALC_FOUND_ROWS debe aparecer en el primer SELECT de la UNION.

El valor de FOUND_ROWS() es exacto slo si se usa UNION ALL . Si se usa UNION sin ALL,

se eliminan duplicados y el valor de FOUND_ROWS() es slo aproximado.

Si no hay LIMIT en UNION, se ignora SQL_CALC_FOUND_ROWS y retorna el nmero de registros en la tabla temporal que se crea para procesar UNION.

LAST_INSERT_ID(), LAST_INSERT_ID(expr)

Retorna el ltimo valor generado automticamente que se insert en una columna AUTO_INCREMENT.
mysql> SELECT LAST_INSERT_ID(); -> 195

El ltimo ID generado se mantiene en el servidor para cada conexin. Esto significa que el valor de la funcin retorna a cada cliente el valor AUTO_INCREMENT ms reciente generado por ese cliente. Este valor no puede ser afectado por otros clientes, incluso si generan valores AUTO_INCREMENT ellos mismos. Este comportamiento asegura que reciba sus propios IDs sin tener en cuenta la actividad de otros clientes y sin la necesidad de bloqueos o transacciones. El valor de LAST_INSERT_ID() no cambia si actualiza la columna AUTO_INCREMENT de un registro con un valor no mgico (esto es, un valor que no es NULL ni 0). Si inserta varios registros a la vez con un comando de insercin LAST_INSERT_ID() retorna el valor del primer registro insertado. La razn para esto es hacer posible reproducir fcilmente el mismo comando INSERT contra otro servidor. Si usa INSERT IGNORE y el registro se ignora, el contador AUTO_INCREMENT no se incrementa

yLAST_INSERT_ID() retorna 0, lo que refleja que no se ha insertado ningn registro. (Antes de MySQL 4.1,AUTO_INCREMENT el contador se incrementa y LAST_INSERT_ID() retorna el nuevo valor.) Si se da expr como argumento para LAST_INSERT_ID(), el valor del argumento se retorna por la funcin y se recuerda como el siguiente valor a ser retornado por LAST_INSERT_ID(). Esto puede usarse para simular secuencias:

Cree una tabla para guardar el contador de secuencia y inicializarlo:

mysql> CREATE TABLE sequence (id INT NOT NULL); mysql> INSERT INTO sequence VALUES (0);

Use la tabla para generar nmeros de secuncia como aqu:

mysql> UPDATE sequence SET id=LAST_INSERT_ID(id+1); mysql> SELECT LAST_INSERT_ID();

El comando UPDATE incrementa el contador de secuencia y causa que la siguiente llamada aLAST_INSERT_ID() retorne el valor actualizado. El comando SELECT recibe ese valor. La funcin de la API Cmysql_insert_id() puede usarse para obtener el valor . Consulte Seccin 24.2.3.34, mysql_insert_id(). Puede generar secuencias sin llamar a LAST_INSERT_ID(), pero la utilidad de usar esta funcin de esta forma es que el valor ID se mantiene en el servidor como el ltimo valor generado automticamente. Es vlido para multi

usuarios porque varios clientes pueden realizar el comando UPDATE y obtener su propio valor de secuencia con el comando SELECT (o mysql_insert_id()), sin afectar o ser afectado por otros clientes que generen sus propios valores de secuencia. Tenga en cuenta que mysql_insert_id() slo se actualiza tras los comandos INSERT y UPDATE , as que no puede usar la funcin de la API C para recibir el valor de LAST_INSERT_ID(expr) tras ejecutar otros comandos SQL como SELECT o SET.
ROW_COUNT() ROW_COUNT() retorna el nmero de registros

actualizados, insertados o borrados por el comando precedente. Esto es lo mismo que el nmero de registros que muestra el cliente mysql y el valor de la funcin de la API Cmysql_affected_rows() .
mysql> INSERT INTO t VALUES(1),(2),(3); Query OK, 3 rows affected (0.00 sec) Records: 3 Duplicates: 0 Warnings: 0

mysql> SELECT ROW_COUNT(); +-------------+ | ROW_COUNT() | +-------------+ | 3 | +-------------+ 1 row in set (0.00 sec) mysql> DELETE FROM t WHERE i IN(1,2); Query OK, 2 rows affected (0.00 sec) mysql> SELECT ROW_COUNT(); +-------------+ | ROW_COUNT() |

+-------------+ | 2 | +-------------+ 1 row in set (0.00 sec) ROW_COUNT() se aadi en MySQL 5.0.1. SESSION_USER() SESSION_USER() es sinnimo de USER(). SYSTEM_USER() SYSTEM_USER() es sinnimo de USER(). USER()

Retorna el nombre de usuario y de equipo de MySQL actual.


mysql> SELECT USER(); -> 'davida@localhost'

El valor indica el nombre de usuario especificado al conectar con el servidor, y el equipo cliente desde el que se est conectando. El valor puede ser distinto del de CURRENT_USER(). Puede extraer la parte de nombre de usuario as:
mysql> SELECT SUBSTRING_INDEX(USER(),'@',1); -> 'davida'

En MySQL 5.0, USER() retorna un valor en el conjunto de caracteres utf8, as que debe asegurarse que la literal'@' se interpreta en el conjunto de caracteres:
mysql> SELECT SUBSTRING_INDEX(USER(),_utf8'@',1); -> 'davida' VERSION()

Retorna una cadena que indica la versin del servidor MySQL. La cadena usa el conjunto de caracteres utf8 .
mysql> SELECT VERSION();

-> '5.0.9-standard'

Tenga en cuenta que si su cadena de versin acaba con -log significa que el logueo est activado.

sta es una traduccin del manual de referencia de MySQL, que puede encontrarse en dev.mysql.com. El manual de referencia original de MySQL est escrito en ingls, y esta traduccin no necesariamente est tan actualizada como la versin original. Para cualquier sugerencia sobre la traduccin y para sealar errores de cualquier tipo, no dude en dirigirse a mysql-es@vespito.com.
Copyright 1997, 2011, Oracle and/or its affiliates. All rights reserved. Legal Notices

Top / Previous / Next / Up / Table of Contents



Developer Zone
Documentation Developer Articles Forums Lists Bugs Worklog Planet MySQL Labs

Downloads
MySQL Community Server MySQL Proxy MySQL Cluster MySQL Workbench MySQL Connectors Archives

Documentation
MySQL Reference Manuals MySQL Workbench Expert Guides Topic Guides MySQL Cluster Other Documents About Archives

About MySQL
Contact Us How to Buy Partners

Job Opportunities Site Map

Legal
Legal Policies Your Privacy Rights Terms of Use Trademark Policy Contributor Agreement

Consulta lenta desde VFP y Rpido desde SQL


28 entradas de 15 autores

Alci 05/08/13
Hola a todos, Tengo un reporte que realiza una simple consulta no muy compleja, desde el lado del SQL es decir desde SQL Server Management Studio la consulta en realiza en pocos segundos, pero al ejecutar desde la aplicacin demora mucho mas. El select es con cuatro tablas que realiza un suma de unos campos para mostrar el saldo total de la deuda de los cliente, no tiene nada de especial, tiene filtro por tipo de crdito, cdigo de cliente y cosas por el estilo. Desde el lado del SQL M.S. demora entre 1 a 3 segundo en mostrar el resultado, pero desde el informe demora aproximadamente entre 30 a 40 segundos, ya es mucho para estar mirando el monitor jejeje. Porque podra ser eso, alguien tiene alguna sugerencias? Saludos, Alcides.

Luis Maria Guayan 05/08/13


Podras poner la clausula SELECT e informar cuantos registros es el resultado? Luis Mara Guayn Tucumn, Argentina _________________________ http://www.PortalFox.com Nada corre como un zorro _________________________ El 05/08/2013 11:46, Alci escribi:
- mostrar texto citado -

DSANCHEZ 05/08/13
Hola, es interesante este tema, sorry x meter mi cuchara, pero he notado desde sql server 2005 que las consultas se hacen lentas desde vfp, en sql server 2000, bien rapido y en mysql server ya ni digamos consigos respuestas super rapidas, pero como les dije cualquier consulta de tipo select idclientes, codcliente, nombres, saldo from tblclientes order by idclientes select idproveedores, codprov, nombres, saldo from tblProveedores order by idproveedores Hice estas dos consultas y dilata demasiado en vfp y vb.net, para lo que dilata en mysql server o mariadb. Esta consulta la cargue en un form, dilata el triple de lo que me carga en sql server e incluso de oracle recibo mayor velocidad. Creo que es lo mismo que te sucede, o sera coincidencia. Saludes Douglas

El 5 de agosto de 2013 08:47, Luis Maria Guayan <luism...@gmail.com> escribi:


- mostrar texto citado -

-Ing. Douglas Snchez Guilln

Consultor Informatico Claro: 505 88495476

Luis Mata 05/08/13 Yo trabaje con SQL 2008 actualmente con 2012, como te dicen seria bueno que coloques el codigo para mirarlo.
From: Douglas Snchez Sent: Monday, August 05, 2013 9:59 AM To: publice...@googlegroups.com Subject: Re: [vfp] Consulta lenta desde VFP y Rpido desde SQL
- mostrar texto citado -

Ariel 05/08/13
probaste configurando el ODBC para sqlserver? a mi me pasaba y con eso se soluciono -Ariel D'Alfeo Crdoba, Argentina

El 05/08/2013 11:59, Douglas Snchez escribi:


- mostrar texto citado -

Fernando D. Bozzo 05/08/13


En general todos los problemas de lentitud de las consultas del lado de FoxPro suelen ser porque no se usan los ndices correctamente, o sea, la optimizacin Rushmore. Eso se puede verificar poniendo SYS(3054,11) en la ventana de comandos antes de ejecutar la

consulta, luego el resultado esperado debera decir que la optimizacin es parcial o total, pero si dice "none" (o ninguna), entonces este es el problema. Si el filtro se est haciendo por tipo de crdito, cdigo de cliente y otros, entonces debera haber un ndice con cada una de esas claves, aunque en Fox la mayor velocidad se suele obtener con una nica clave que sea la suma de los campos del filtro, aunque incluso con los ndices muchos suelen poner mal luego la condicin en el Select-SQL.

Roberto Retegui Kanashiro

05/08
Re: [vfp] Re: Consulta lenta desde VFP y Rpido desde SQL

Fernando no son tablas nativas, el usa SQL Server, yo tambin note eso, tengo unas consultas que me usa vistas anidadas y en el mismo navicat lo hace rapidicimo pero en el Fox se demora unos varios segundo, hasta el momento no se el porque. Aunque creo que el problema es por que el vfp no maneja multi hilos para llenar la tabla, una vez que haces el select el vfp no para hasta llenar toda la tabla, mientras que en Lazarus le llena una parte y luego le va llenando de a pocos. Saludos

El 5 de agosto de 2013 10:38, Fernando D. Bozzo <fdb...@gmail.com> escribi: En general todos los problemas de lentitud de las consultas del lado de FoxPro suelen ser porque no se usan los ndices correctamente, o sea, la optimizacin Rushmore. Eso se puede verificar poniendo SYS(3054,11) en la ventana de comandos antes de ejecutar la consulta, luego el resultado esperado debera decir que la optimizacin es parcial o total, pero si dice "none" (o ninguna), entonces este es el problema. Si el filtro se est haciendo por tipo de crdito, cdigo de cliente y otros, entonces debera haber un ndice con cada una de esas claves, aunque en Fox la mayor velocidad se suele obtener con una nica clave que sea la suma de los campos del filtro, aunque incluso con los ndices muchos suelen poner mal luego la condicin en el Select-SQL.

-btnMyVideo.Click()

Alci 05/08/13
Tratare de explicar lo que paso. El sistema esta diseado para ser multi-empresa, en todas las tablas tiene el cdigo de la empresa... La consulta devuelve correctamente los datos porque en la BD que utilizo hay una sola empresa, lo que paso fue que en la consulta no se realizo ningn filtro por empresa, no pase como parametro el cdigo de la empresa. Al agregar en el filtro el cdigo de la empresa mejoro la velocidad de la consulta, prcticamente se normalizo. Supongo que afecto al rendimiento al tener claves compuestas con el cdigo de la empresa en las tablas y por no utilizarlo dentro de la clausula where, porque en los join's si interviene. Re-configurando los driver o utilizando el SQL Native Client o SQL Server no cambiaba el comportamiento. Segua igual. Lo raro de esto es que con el SQL Server Management Studio la consulta es rpida, pero desde el lado del vfp demoraba bastante. Gracias a todos. Saludos. Alcides Portillo PD: Para Fernando D. Bozzo, la Base de datos que utilizo es del SQL Server, por lo tanto no afecta la tecnologa Rushmore, la consulta se resuelve del lado del servidor y no del VFP, de todos modos gracias por tu aporte.

Roberto Retegui Kanashiro

05/08
Re: [vfp] Re: Consulta lenta desde VFP y Rpido desde SQL

Alci otra cosa que tambin me sucedi y lo soluciones es crear indices por los campos que condicionan la consulta, cuando los datos son bastantes se empieza a hacer lenta la consulta.

Saludos

El 5 de agosto de 2013 11:25, Alci <alcides...@gmail.com> escribi:


- mostrar texto citado -

-btnMyVideo.Click()

Fernando D. Bozzo 05/08/13


Re: [vfp] Re: Consulta lenta desde VFP y Rpido desde SQL

Ahora te entiendo. FoxPro tambin puede hacer ese tipo de consulta, que se llama asincrnica. El problema en ese caso es que la ventaja que se le pueda sacar a poder ir viendo resultados de a poco se pierde en velocidad, por eso las consultas sincrnicas son ms rpidas. Igualmente me extraa que te tarde tanto. de cuntos registros hablamos? y que tamao de registro? Porque del lado del cliente solo veo que puedan influir dos cosas, el diversos usado y la configuracin que se use. Aport ms datos, a ver si se puede ver la causa aparente. Adems de lo que te pregunt ms arriba, pon el driver que uss y con que configuracin lo ests usando. El 05/08/2013 18:17, "ZeRoberto" <zero...@gmail.com> escribi:
- mostrar texto citado -

Luis Mata 05/08/13


Re: [vfp] Re: Consulta lenta desde VFP y Rpido desde SQL

Hay que construir bien las consultas, muchas veces son errores nuestros, a mi me paso una consulta construida al guerrazo para salir de paso, demoraba casi 30 minutos, lo deje pero al final lo revise y la misma informacin con una select optimizado con indices, inner join, select(select).. bajo a menos de 1 minuto.
From: Alci

Sent: Monday, August 05, 2013 11:25 AM To: publice...@googlegroups.com Subject: [vfp] Re: Consulta lenta desde VFP y Rpido desde SQL
- mostrar texto citado -

Milton 05/08/13
Cuando envas desde VFP a SQL Server una consulta mediante SELECT, por ms sensilla que sea, esta tiene que compilarse. Se puede mejorar la velocidad de respuesta si pones el SELECT dentro de una funcin, y llamas de VFP a esta funcin mediante parmetros, de esta manera la consulta est siempre precompilada y el proceso de consulta ser ms rpida. Ejm: Consulta lenta = SQLExec(1,'SELECT * FROM Clientes FOR ClienteId=100' ,'Cursor')

Ejm: Consulta rpida -- PRIMERO EJECUTAR ESTO EN SQL M.S.E CREATE FUNCTION [dbo].[DatosCliente] (@ClienteId int) RETURNS TABLE AS RETURN ( SELECT A.*, B.GruInvNomb FROM Clientes WHERE ClientesId=@ClienteId )

* AHORA EJECTA ESTO DESDE VFP = SQLExec(1,'SELECT * FROM dbo.DatosCliente(100)' ,'Cursor') Esto no necesita de complatacin, porque la FUNCION DatosCliente ya esta precompilada. De todas maneras me parece mucho tiempo el que tu indicas, puede intentar lo que te indico y mucha suerte. Atentametne

MILTON

El lunes, 5 de agosto de 2013 09:46:13 UTC-5, Alci escribi:


- mostrar texto citado -

Roberto Retegui Kanashiro

05/08
Re: [vfp] Re: Consulta lenta desde VFP y Rpido desde SQL

El tiempo de compilacin no creo que le demore minutos, eso lo hace en nano segundos.

El 5 de agosto de 2013 11:56, Milton <servy...@hotmail.com> escribi:


- mostrar texto citado -

-btnMyVideo.Click()

Fernando D. Bozzo 05/08/13


Re: [vfp] Re: Consulta lenta desde VFP y Rpido desde SQL

Tampoco hace falta llegar al extremo, las consultas externas se pueden optimizar en fox de varias formas, por ejemplo precompilndola en Fox con sqlprepare y usando bind variables para no meter los datos directamente, sino con ?Var en los parmetros El 05/08/2013 18:57, "Milton" <servy...@hotmail.com> escribi:
- mostrar texto citado -

Fernando D. Bozzo 05/08/13


Re: [vfp] Re: Consulta lenta desde VFP y Rpido desde SQL

Ojo, los tiempos de compilacin s que influyen, aunque tomen algo menos de un segundo (no son nanosegundos ni en el propio servidor), se notan y mucho cuando hay que realizar muchas consultas seguidas, por ejemplo en un proceso tipo batch. El 05/08/2013 19:01, "ZeRoberto" <zero...@gmail.com> escribi:
- mostrar texto citado -

Roberto Retegui Kanashiro

05/08
Re: [vfp] Re: Consulta lenta desde VFP y Rpido desde SQL

Pero si la consulta en si demora 0.33 segundos entonces cuando demorara la compilacin.

El 5 de agosto de 2013 12:08, Fer <fdb...@gmail.com> escribi:


- mostrar texto citado -

-btnMyVideo.Click()

Fernando D. Bozzo 05/08/13


Re: [vfp] Re: Consulta lenta desde VFP y Rpido desde SQL

Puede que unas cuantas centsimas de segundo El 05/08/2013 19:27, "ZeRoberto" <zero...@gmail.com> escribi:
- mostrar texto citado -

Miguel 05/08/13
Re: [vfp] Re: Consulta lenta desde VFP y Rpido desde SQL

SQL Server usa rushmore desde la versin 7. Una de las razones por las que M$ no suelta los fuentes de Fox. Parece que ese tipo de algoritmo no se puede patentar o es difcil de probar robo de idea con algo equivalente. Esto es lo que en algn lado se dijo, no se cuando ni quien cuando salio el SQL Server 7. Saludos: Miguel, La Pampa (RA)

El 5 de agosto de 2013 14:30, Fer <fdb...@gmail.com> escribi:


- mostrar texto citado -

David Salazar 05/08/13


Re: [vfp] Re: Consulta lenta desde VFP y Rpido desde SQL

Como curiosidad porque no haces un procedimientos almacenado con tu consulta, le envias los parametros, y lo ejecutas desde fox, y ves los tiempos que tarda.

2013/8/5 Carlos Miguel FARIAS <carlosmig...@gmail.com>


- mostrar texto citado -

Luis Mata 05/08/13


Re: [vfp] Re: Consulta lenta desde VFP y Rpido desde SQL

Esta es una buena idea, pero de todas maneras si la consulta esta mal construida o los ndices estn mal definidos no funcionaria.
From: David Salazar Sent: Monday, August 05, 2013 4:42 PM To: publice...@googlegroups.com Subject: Re: [vfp] Re: Consulta lenta desde VFP y Rpido desde SQL
- mostrar texto citado -

mpulla 05/08/13
Re: [vfp] Re: Consulta lenta desde VFP y Rpido desde SQL

Hola Alci. Puedes medir el tiempo que demora desde hacer el pedido hasta que te devuelve el resultado? Como dice David, crate un SP y compara los tiempos. Pienso que la diferencia debe ser minima, entre ejecutarlo en Sql Server Management y VFP. Saludos. Mauricio

Alci 06/08/13
El problema estaba en el filtro de la consulta, falto agregar el Cdigo de la Empresa en el Where de la consulta, supongo que afecto el rendimiento como las claves son compuesta con campo cdigo de la empresa (IdEmpresa). No me di cuenta porque en la Base de Datos que estaba utilizando solo tengo cargado datos de una empresa, es por eso que los resultados eran correctos y no me di cuenta que falto el filtro de la empresa. Despus de agregar el filtro por empresa en la clausula where se normalizo. Gracias a todos por su valiosa colaboracin. Saludos. Alcides.

Victor Manuel Thomas 19/11/13


HOla todos ! me gustara saber si encontraron alguna solucin, ya que tengo el mismo inconveniente, tengo una consulta de 300,000 registros que a su ves se convierten en 30 registros como resumen, igual en sql manage corre en 9 segundos pero desde el lado de fox se tarda 20 minutos, tengo creado un SP del lado del servidor que era bastante rapido al principio pero a medida a ah ido creciendo la data se torno lento la consulta del lado de fox, tengo VPF9 y SQL Server 2008 R2 Express. cuenta con todos los indices necesarios pero por si alguien sabe de algo q pueda ayudarme.

Por cierto probe con ODBC y efectivamente corre a la velocidad de SQL Manage pero ir a configurar ODBC a 50 equipos no tiene mucha gracia, menos cuando tienes que cambiar clave cada cierto tiempo. saludos PD les dejo la la construccin del string, que funciona muy bien para tablas simples y reportes no mayores de 100,000 registros. que a mas de uno se que le servira. DRIVER=SQL Server UID=sa LANGUAGE=Espaol DATABASE=midata WSID=MIPC APP=Sistema operativo Microsoft Windows SERVER=servidor\instancia Description=Conexion ....

El lunes, 5 de agosto de 2013 08:46:13 UTC-6, Alci escribi:


- mostrar texto citado -

mpulla 19/11/13
Hola Victor. Traes 300,000 registros y los resumes en 30 la data es de 300,000 que los resumes en tu sp. En todo caso 300,000 resgistros es poco. 9 segundos es mucho tiempo, seria bueno ver tu sp, tablas e indices a ver si te podemos aportar algo. Saludos. Mauricio

Luis Mata 19/11/13


Re: [vfp] Re: Consulta lenta desde VFP y Rpido desde SQL

No quieres instalar el ODBC en cada PC? pero al menos hasta W7 ya viene preinstalado los ODBC
From: Victor Manuel Thomas Sent: Tuesday, November 19, 2013 1:19 PM To: publice...@googlegroups.com Subject: [vfp] Re: Consulta lenta desde VFP y Rpido desde SQL
- mostrar texto citado -

Miguel Canchas 19/11/13


RE: [vfp] Re: Consulta lenta desde VFP y Rpido desde SQL

Y el codigo ?

MK
De: publice...@googlegroups.com [mailto:publice...@googlegroups.com] En nombre de Victor Manuel Thomas Enviado el: martes, 19 de noviembre de 2013 01:19 p.m. Para: publice...@googlegroups.com Asunto: [vfp] Re: Consulta lenta desde VFP y Rpido desde SQL

HOla todos ! me gustara saber si encontraron alguna solucin, ya que tengo el mismo inconveniente, tengo una consulta de 300,000 registros que a su ves se convierten en 30 registros como resumen, igual en sql manage corre en 9 segundos pero desde el lado de fox se tarda 20 minutos, tengo creado un SP del lado del servidor que era bastante rapido al principio pero a medida a ah ido creciendo la data se torno lento la consulta del lado de fox, tengo VPF9 y SQL Server 2008 R2 Express. cuenta con todos los indices necesarios pero por si alguien sabe de algo q pueda ayudarme.

Por cierto probe con ODBC y efectivamente corre a la velocidad de SQL Manage pero ir a configurar ODBC a 50 equipos no tiene mucha gracia, menos cuando tienes que cambiar clave cada cierto tiempo.

saludos

PD les dejo la la construccin del string, que funciona muy bien para tablas simples y reportes no mayores de 100,000 registros. que a mas de uno se que le servira.

DRIVER=SQL Server UID=sa LANGUAGE=Espaol DATABASE=midata WSID=MIPC APP=Sistema operativo Microsoft Windows SERVER=servidor\instancia Description=Conexion ....

El lunes, 5 de agosto de 2013 08:46:13 UTC-6, Alci escribi: Hola a todos,

Tengo un reporte que realiza una simple consulta no muy compleja, desde el lado del SQL es decir desde SQL Server Management Studio la consulta en realiza en pocos segundos, pero al ejecutar desde la aplicacin demora mucho mas.

El select es con cuatro tablas que realiza un suma de unos campos para mostrar el saldo total de la deuda de los cliente, no tiene nada de especial, tiene filtro por tipo de crdito, cdigo de cliente y cosas por el estilo.

Desde el lado del SQL M.S. demora entre 1 a 3 segundo en mostrar el resultado, pero desde el informe demora aproximadamente entre 30 a 40 segundos, ya es mucho para estar mirando el monitor jejeje.

Porque podra ser eso, alguien tiene alguna sugerencias?

Saludos,

Alcides.

mapner 19/11/13

Fijate si tus tablas tienen campos BLOB y los ests trayendo en la consulta. El uso de campos BLOB enlentece mucho a la hora de traer datos por ODBC hacia VFP. saludos El lunes, 5 de agosto de 2013 11:46:13 UTC-3, Alci escribi: Hola a todos, Tengo un reporte que realiza una simple consulta no muy compleja, desde el lado del SQL es decir desde SQL Server Management Studio la consulta en realiza en pocos segundos, pero al ejecutar desde la aplicacin demora mucho mas. El select es con cuatro tablas que realiza un suma de unos campos para mostrar el saldo total de la deuda de los cliente, no tiene nada de especial, tiene filtro por tipo de crdito, cdigo de cliente y cosas por el estilo. Desde el lado del SQL M.S. demora entre 1 a 3 segundo en mostrar el resultado, pero desde el informe demora aproximadamente entre 30 a 40 segundos, ya es mucho para estar mirando el monitor jejeje. Porque podra ser eso, alguien tiene alguna sugerencias? Saludos, Alcides.

MALKASOFT ADPI: http://www.developervfp.blogspot.com/

Hola, te recomiendo que no uses Select * From, debes usar Select Campo1, Campo2 etc From, ahora aparte de index normales como pk y fk tiene que crear indices CLUSTERED o NOCLUSTERED eso ara que tu consulta sea muy rpido cuando lo llames de cualquier herramienta de programacin. te paso un link para que veas la diferencia http://grimpidev.wordpress.com/2008/03/08/diferencias-entre-clustered-y-non-clusteredindex-en-sql-server/

Saludos;

Ing. Russvell Jesus Soto Gamarra http://developervfp.blogspot.mx/ Framework Multi-conexion a cualquier base de datos v6.0 http://www.youtube.com/watch?v=PCCZvCaet74 Canal YouTube: http://www.youtube.com/rycjesusrj

Вам также может понравиться