Tu código puede pulirse un poco más. A simple vista rápida puedo decirte lo siguiente:
1. Después de abrir el Query con el SELECT y antes de empezar a operar por seguridad se recomienda aplicar un .First para obligar al dataset a ubicarse en el primer registro. Se que con el Open() se posiciona en el 1er registro, pero es habitual llevar un código seguro. Sobre todo cuando se va a iterar como en el while... antes del while, es importante asegurarse de que esté en el primer registro.
2. Te sugiero usar parámetros. Te evitas tener que lidiar con aplicas conversiones innecesarias. Por ejemplo en el UPDATE:
UPDATE compras SET saldo = :elSaldo WHERE id = :elID
Como puedes ver, se usa dos parámetros, y para ello se antepone los dos puntos.
Y para acceder a ellos se hace mediante ParamByName(), similar a como los para los campos. De este modo le puedes pasar por medio de AsCurrency el valor exacto y dejarle al componente que haga el trabajo.
Aunque no estoy seguro de si ExecuteDirect permite parámetros, y si es que el Zconnection tiene para ese caso el ParamByName. Mi primer pensamiento es que no lo soporta.
Una alternativa para este caso, y que al menos para mi quizá sea más segura y apropiada que usar ese ExecuteDirect, es emplear otro Query adicional que ejecute esta consulta UPDATE.
Basicamente es trabajar con 2 query, una para traer el conjunto original. Y una 2da adicional para aplicar las actualizaciones sobre este conjunto.
3. la variable vsaldo debería ser Currency y no del tipo real. Puede darte problemas de precisión más adelante. Currency es la vía segura cuando se trata de asuntos monetarios.
4. No te olvides de aplicar un Commit para finalizar la transacción con todas las operaciones de forma segura.
Y como dijo Agustín, los componentes data-ware como son el DBGrid, DBEdit, etc. no son más que un intermediario hacia el TDataSet. Quien tiene los datos es en realidad el TDataSet, ya que es la fuente que interactúa con la base de datos. Los diferentes Querys, Tables, StoredProcs, etc de las diferentes suites no dejan de ser un hijos descendientes de un TDataSet.
Los componentes visuales simplemente le piden el dataset con el que están vinculados que les pase el/los valor/es y para aplicarle cambios le envían la orden al dataset correspondiente.
Respecto a material de lectura, no se cuanto más te aporte La Cara Oculta de Delphi respecto al libro de Lazarus que tu compraste. Desconozco el contenido de ese libro de Lazarus.
La Cara Oculta de Delphi 4 es una referencia obligada para quien se meta en el mundo Object Pascal. Su contenido lo podrás sin problemas extrapolar a Lazarus. Pero como dije: no se que tanto contenido "nuevo" o "adicional" y que ya no esté dicho en el libro de Lazarus te pudiera dar.
Leer ambos no te va a hacer daño, te va a enriquecer más seguro. Lo que tiene de bueno La Cara Oculta es que pone mucho énfasis en el área de conectarse a base de datos. Ese plus es lo que estás buscando seguro, aunque me pregunto si es que en el libro de Lazarus no tendrá también sus capítulos sobre el tema.
En última, y lo que te recomiendo, es que cuando sea una duda muy puntual sobre ciertos componentes de Lazarus, oque por aquí no le encontremos la vuelta, lo más sano es acudir al foro oficial. Yo en su momento tuve dudas muy puntuales sobre el uso de TBGRABitmap y y me respondieron muy amablemente ¡Incluso el propio creador fue quien salió en mi ayuda!. Tiene una comunidad muy participativa. Eso si: es en inglés, y si te cuesta un poco el idioma San Traductor de Google mal que bien se da a entender bastante bien.
Saludos,