TMS Software. All-Access

What’s new in TMS FNC UI Pack 3.4

There are a lot of great new features available in our FNC components and this blog will highlight the new additions to the TMS FNC UI Pack. If you want to check the improvements on TMS FNC Maps, click here. For the list of fixes and improvements, you can check the version history, but two new components were added to the product as well. TTMSFNCPassLock TTMSFNCPassLock is an updated version of the FMX passlock in the TMS FMX UI Pack.This component gives you the ability to add password protection to your application. It’s not only possible to further customize the buttons and pattern, but also the ability to not show the length of your password. Next to that you have the similar workings of the numpad and pattern layout and the learn mode to set a new password. TTMSFNCControlPicker The TTMSFNCControlPicker helps you to create a dropdown variant of your control. This can be done with the ITMSFNCControlPicker interface and is implemented by default in the TTMSFNCTreeView, TTMSFNCTableView, TTMSFNCListBox and TTMSFNCListEditor. It is possible to implement the interface in your own control, for more information regarding the necessary procedures and functions to implement, please check the documentation.Some additional events are available, to mimic the basic mechanics of the interface without implementing it and to make the control even more customizable. This is an example of the base implementation to retrieve the content that should be shown in the dropdown edit. It shows the number of times the button was clicked. First create a new extended button class: type TButtonEx = class(TButton, ITMSFNCControlPickerBase) private FCount: Integer; function PickerGetContent: String; protected procedure Click; override; public constructor Create(AOwner: TComponent); override; end; { ButtonEx } procedure TButtonEx.Click; begin inherited; Inc(FCount); if Assigned(Parent) and (Parent is TTMSFNCCustomSelector) and Assigned(Parent.Owner) and (Parent.Owner is TTMSFNCControlPicker)then begin //Update ControlPicker if assigned as control (Parent.Owner as TTMSFNCControlPicker).UpdateDropDown; end; end; constructor TButtonEx.Create(AOwner: TComponent); begin inherited; FCount := 0; Text := ‘Click this’; end; function TButtonEx.PickerGetContent: String; begin Result := IntToStr(FCount) + ‘ Clicks’; end; The only thing left to do is creating the button and assiging it to a TTMSFNCControlPicker: procedure TForm1.FormCreate(Sender: TObject); begin b := TButtonEx.Create(Self); b.Parent := self; TMSFNCControlPicker.Control := b; end;

Read More

Announcing support for FMXLinux!

Intro A couple of weeks ago we announced beta support for FMXLinux and today we announce stable support. The beta period is finished and we now fully support FMXLinux in the latest version of all of our FNC products. Download the latest update today to get started! Below is a list of FNC products that have been tested in FMXLinux. With FMXLinux, we add a new platform to the wide variety of already supported platforms in FNC. TMS FNC Components can be used simultaneously on these frameworks TMS FNC Components can be used simultaneously on these operating systems/browsers TMS FNC Controls can be used simultaneously on these IDEs Getting Started The components have been tested and deployed on a Linux environment (Ubuntu 20.04) after properly setting up FMXLinux and other dependencies required for various parts of FNC. Support for FMXLinux is limited to RAD Studio 10.4 Sydney and the path to the source files has to be manually configured in the library path (the automated installer currently does not pick up FMXLinux). Please follow the instructions below to add FMXLinux support to RAD Studio. Please note that adding the SDK is an essential part of the configuration process and it is important to add the SDK to RAD Studio when all the necessary libraries are added to your Linux environment. After following the above instructions, please execute the following commands sudo apt install joe wget p7zip-full curl openssh-server build-essential zlib1g-dev libcurl4-gnutls-dev libncurses5 sudo apt-get install zlib1g-dev sudo apt install libgl1-mesa-glx libglu1-mesa libgtk-3-common libgstreamer1.0-0 libgstreamer-plugins-base1.0-0 sudo apt install libwebkit2gtk-4.0-dev Add each path that contains FNC source files of the products you have installed to the Linux 64 bit library path. Start a new multi-device FMX project and select the Linux 64 bit profile. When the PAServer is running correctly, you can connect to Linux environment and start deploying your application.  Video The above instructions along with a showcase of some FNC components are demonstrated in the video below. Stay tuned! With FMXLinux support we add yet another major and exciting feature to the already huge amount of features and components FNC has to offer. Yesterday we also announced exciting new features and improvements in TMS FNC Maps 1.5 and TMS FNC UI Pack 3.4. Read the linked blog posts to find out more. Stay tuned for more FNC improvements and features coming up in the near future!.

Read More

What’s new in TMS FNC Maps 1.5

We are back with another substantial update for TMS FNC Maps. 4 new components are introduced in TMS FNC Maps v1.5: TTMSFNCStaticMap, TTMSFNCMapsImage, TTMSFNCTollCost and TTMSFNCTimeZone. 1. Static Maps & Map Image The new TTMSFNCStaticMap component lets you request a static map image for a specific location. The static image can be customized by setting the map type (roads, satellite …), zoom level and an optional marker at the center point. The resulting image can be displayed by using the TTMSFNCMapsImage component. The following mapping services are supported: Azure, Bing, Google, Here, MapBox, TomTom Only a single line of code is needed to request and display a static map image: TMSFNCMapsImage1.URL := TMSFNCStaticMap1.GetStaticMap(CenterCoordinate,  TMSFNCMapsImage1.Width, TMSFNCMapsImage1.Height, ZoomLevel, ShowMarkerBoolean, MapType);     2. Toll Cost calculation Using the TTMSFNCTollCost component the toll route costs between an origin and destination location can be calculated. Toll cost information is returned for each toll segment along the route together with turn by turn directions. The following mapping services are supported: Here, PTV xServer The toll cost calculation can be requested with just one line of code: TMSFNCTollCost1.GetTollCost(OriginCoordinate, DestinationCoordinate); 3. TimeZone information The TTMSFNCTimeZone component can be used to request time zone information for a specified location. The following mapping services are supported: Azure, Bing, Google, Here Again a minimum of code is needed to request and display time zone information: procedure TForm1.TMSFNCMaps1MapClick(Sender: TObject;  AEventData: TTMSFNCMapsEventData);begin  TMSFNCTimeZone1.GetTimeZone(AEventData.Coordinate.toRec)end;procedure TForm1.TMSFNCTimeZone1GetTimeZone(Sender: TObject;  const ARequest: TTMSFNCTimeZoneRequest;  const ARequestResult: TTMSFNCCloudBaseRequestResult);var  it: TTMSFNCTimeZoneItem;begin  it := ARequest.Items[0];  memo.Lines.Clear;  memo.Lines.Add(‘TimeZone: ‘ + it.TimeZone);  meTimeZone.Lines.Add(it.Description);  meTimeZone.Lines.Add(‘Offset: ‘ + it.Offset);  meTimeZone.Lines.Add(‘DST: ‘ + it.DSTOffset);end; 4. Minor improvements Apart from all the new components, some improvements are also included with this update. One of the noteworthy improvements is the possibility to retrieve the index of the waypoints in the optimized order for TTMSFNCDirections. The following mapping services are supported: Azure, Google Maps, TomTom That’s it for this TMS FNC Maps v1.5 update. I hope you’ll enjoy all these exciting new features!

Read More

#WEBWONDERS : The browser console is your friend

When writing web client applications with TMS WEB Core, chances are you will be spending quite some time in the browser developer tools. This is the place where you can debug your web client applications and can inspect every detail of your web application: the DOM, source, network, performance, local storage, … in a nutshell a wealth of useful information.  One of the capabilities of the browser developer tools is the console and from your application you can add logging statements to output these in the browser console. The closest comparison with the Windows desktop application development world is the OutputDebugString() command that sends text to a debugger. The direct equivalent is using console.log(“Hello world”) that will do exactly the same but to the browser console. But all similarities end here. The console object that is fully available as Pascal class in a TMS WEB Core web client application has many more options. This object is described here: https://www.w3schools.com/jsref/obj_console.asp Timing functions to measure performance A first convenience of the console object is the ability to time certain parts of your code. You can do this by calling console.time(‘identifier’) to start a browser timer and when the part of the code was executed, call console.timeEnd(‘identifier’) and the browser will output the time difference in the browser console. This example demonstrates the timing of a bubble sort algorithm (for the sake of having some code that takes some time to execute) function BubbleSort( list: TStringList ): TStringList; var i, j: Integer; temp: string; begin // bubble sort for i := 0 to list.Count – 1 do begin for j := 0 to ( list.Count – 1 ) – i do begin if ( j + 1 = list.Count ) then continue; if ( list.Strings[j] > list.Strings[j+1] ) then begin temp := list.Strings[j]; list.Strings[j] := list.Strings[j+1]; list.Strings[j+1] := temp; end; end; end; Result := list; end; function GenerateRandomWord(CONST Len: Integer=16; StartWithVowel: Boolean= FALSE): string; const sVowels: string = ‘AEIOUY’; sConson: string = ‘BCDFGHJKLMNPQRSTVWXZ’; var i: Integer; B: Boolean; begin B := StartWithVowel; SetLength(Result, Len); for i := 1 to len DO begin if B then Result[i] := sVowels[Random(Length(sVowels)) + 1] else Result[i] := sConson[Random(Length(sConson)) + 1]; B:= not B; end; end; procedure TForm1.MeasureTime; var sl: TStringList; i: integer; d: dword; mr: TMyRec; begin console.time(‘bubble’); sl := TStringList.Create; for i := 0 to 2000 do begin sl.Add(generaterandomword(8,false)); end; BubbleSort(sl); console.timeEnd(‘bubble’); sl.Free; end; The result in the browser console looks like: Inspecting values of variables, records, objects The console.log() call can have a variable number of arguments of different types. You can call for example: console.log(‘Date today’,DateToStr(Now)); and this will output today’s date in the console. But also objects or records will be shown with all their details in the console, as this example for a record demonstrates: type TMyRec = record Name: string; Age: integer; Member: boolean; end; var mr: TMyRec; begin mr.Name := ‘Delphi’; mr.Age := 25; mr.Member := true; console.log(mr); end; Or take this example, where the details of a HTML element are displayed in the console, in this example the HTML element used for a TWebEdit:  console.log(WebEdit1.ElementHandle); All these statements combined outputted in the browser console: Formatting output If you thought the browser could only output dull fixed text, you are wrong! On top of that, the console.log() command allows you […]

Read More

Customer use case: bringing an FMX app to the web with TMS WEB Core

After years of marketing a Delphi Windows/macOS version of my Star Analyzer program, I found that many clients wanted a web-based program which would run on any device, especially a tablet. They also wanted their data stored in the cloud so that several people could use the program at the same time. The macOS version produced by Delphi was often plagued with macOS incompatibilities, and neither version would run on a tablet. So I decided to take the leap to the web. Another deciding factor was the library of 85 Object Pascal code files that I developed over the years for use with all my programs. I definitely did not want to rewrite my library from scratch. I am rather fond of it. My Star Analyzer program included another 100 Object Pascal code files which all use my library files. So far I have not needed to write a single line of JavaScript or HTML code, and about 80% my existing Delphi code works nicely with the WEB Core components. Some of 20% of new code I had to write was relatively straight forward, and some was a bit tricky. I’ll talk about the tricky parts a bit later in in this Blog. Converting my existing FMX forms to TMS WEB Core As we all know, the components on the forms talk to your code through their event handlers. Theoretically then all I would have to do is create new forms, drop FNC and WEB Core components on the new forms, and use hook them up to most of my existing code.  Not too much work, or so I thought, but it turns out it was not quite that simple. If you look at Star Analyzer for the web you’ll see that it is built around tab controls. Click Data Entry and Data Analysis button and you’ll find there are 15 tab controls on the main form and 18 tab controls on the tabs on the main form. The original program was built around one large and complicated main form that held all the components for all 33 tabs, but the program worked nicely, and was easy to code and trouble shoot. In converting my program to WEB Core, I first duplicated this tab structure using the TTMSFNCPageControl. The new layout looked just like the old layout, and was easy to work with in programming, but it would not compile. It turns out that you can’t compile a program with thousands of components and 33 tabs on one main form. It chokes the compiler. Using Hosted Forms to reduce the complexity of browser pages The solution was to use a TTMSFNCTabSet (which has no pages, just tabs) and to use a hosted form as shown in the TMSDemosWebBasicsFormhosting demo provide by TMS. The text and number of tabs on the main TabSet are changed in code, and the controls that used to be on the tabs are now on a Hosted Form. In the image below the area outside the red box is the main form, while the area inside the red box shows one of the 23 different Hosted Forms. The advantage of Hosted Forms is that each web browser page has a small number of components and on it.  This Case statement below shows how the hosted forms […]

Read More

Upcoming Miletus cross platform support

About 3 weeks ago we released TMS WEB Core v1.7 Ancona. One of the new features was Miletus, our new framework to create desktop applications with TMS WEB Core. It was exciting to see that many of you showed interest in Miletus, so we’ll take a look at what you can expect in the future. What’s coming in TMS WEB Core 1.8 We launched Miletus with Windows 32-bit and 64-bit support, but our goal was already set from the beginning: a cross platform alternative that is based on TMS WEB Core. To make this possible, research work has already started before the TMS WEB Core v1.7 release. We are happy to share that as of today here in the labs, we can already target MacOS and Linux! Starting from TMS WEB Core 1.8 you’ll be able to select the MacOS and Linux target. This will mean that you can create MacOS and Linux applications on Windows without an additional connection to the target systems! After the proper setup, you’ll only need to copy your created application to the operating system of your choice. Keep in mind that for distribution it’s recommended to sign your application and that can only be done on the target operating systems. Why choose Miletus? Miletus is not meant to be an Electron replacement, but rather something to co-exists next to our current Electron support as an alternative to those who want: No NodeJS dependency Smaller executable sizes Less deployed files More broad local database support You can take full advantage of web technologies combined with native operating system level operations: There’s a lot of native functionality exposed already. Access to the local file system, operating system menus and notifications, drag and drop functionality, global shortcuts just to name a few. We are always looking to extend the native support based on your feedback!  You don’t necessarily need a DB backend running, you can easily connect to a local DB file or a cloud DB service just like in a VCL or FMX application! For cross platform targets, the following databases will be supported: SQLite, MSSQL, PostgreSQL, mySQL. This if of course only the beginning, we already have plans to expand the supported DB list! The power of HTML5 and CSS3 is at your disposal. There are a huge amount of libraries and templates available for web applications that you can not only reuse in your Miletus application but with their help you can also create visually more pleasing user interfaces!  And did you know? It’s easy to migrate your existing TMS WEB Core application to Miletus. Watch this hands-on video from our colleague Dr. Holger Flick, who explains the process in detail: After the TMS WEB Core v1.8 release the next step will be to bring Miletus to TMS WEB Core VSC too. We already did some further research in this area, and our results are promising to bring a truly cross platform experience! But that’s not the only long-term goal: based on the feedback we got, we’ll also look to add more DB support!  As mentioned earlier, we have full control over this technology which means we can extend the palette of components and functionalities without depending on 3rd party solutions while maintaining the advantages listed above. We are eager to learn what you’d like to […]

Read More

High performance multi-feature grid

Intro The multi-device, true native app platform The FireMonkey® framework is the app development and runtime platform behind RAD Studio, Delphi and C++Builder. FireMonkey is designed for teams building multi-device, true native apps for Windows, OS X, Android and iOS, and getting them to app stores and enterprises fast. source: https://www.embarcadero.com/products/rad-studio/fm-application-platform FMX (FireMonkey) released in 2011 and shortly after we delivered a first set of components. Today, we want to show you the TTMSFNCGrid component, a high performance multi-feature grid Features Below is a list of the most important features the TTMSFNCGrid has to offer. The features are not limited to this list, but this will give you a quick insight on what we offer to be able to create an application that visualizes your data in a grid structure in FireMonkey. Column Persistence Fixed cell single and range selection Autosizing columns / rows on double-click Highly configurable and flexible grid Various cell types available and built-in as well as support for custom cell types Fixed columns left and/or right, fixed rows at top and/or bottom. Column & row freezing High performance virtual mode Several selection modes: single & multi cell, column, row, distinct cell, row, column Cells with support for HTML formatted text, hyperlinks Editing with range of built-in editor types and capability of using custom cell inplace editors Cell merging and splitting Grouping support with summary rows, and group calculations such as average, sum, min, max, custom calculation… Filtering with optional auto filtering via dropdown Different cell layouts for different cell states Read-only and/or fixed state per cell configurable Single column sorting, indexed column sorting, grouped column & indexed column sorting Pixel and cell scrolling modes Keyboard and Mouse handling customization: tab, enter, insert, delete key handling Column and row dragging and sizing Cell controls such as checkbox, radiobutton, button, bitmap, progressbar etc… Configurable touch scrolling optimized for iOS / Android Banding Clipboard support HTML Export PDF Export Excel Import / Export via the TTMSFNCGridExcelIO Find and replace functionality Separate ToolBar Popup Learn More! Want to learn more about what the TTMSFNCGrid can do? Here is a video that highlights some of the above features through a demo application. Download & Explore! The TTMSFNCGrid component is part of the TMS FNC UI Pack, which, on top of FMX, also offers the ability to write your code once and target other frameworks (VCL, LCL and WEB). You can download a full featured trial version of the TMS FNC UI Pack and start exploring the capabilities of the TTMSFNCGrid component. Stay tuned! The TTMSFNCGrid is the fifth and last component of a series of components that is covered to empower your FMX (FireMonkey) developments. We started the series with a general overview of the most important components that we have to offer, followed by the TTMSFNCRichEditor, TTMSFNCPlanner, TTMSFNCTreeView and the TTMSFNCKanbanBoard. Keep an eye on our blog post for more exciting news coming up for the FMX framework and FNC in the form of a whole new platform!

Read More

Firestore async dataset methods in TMS WEB Core v1.7

In this last blog article of 4 blog posts, we introduce a last major new feature in the Google Firestore dataset, i.e. new async features. Before providing details about these new features, let’s first look at the classic VCL TClientDataSet, how it can work how it works and what the implications are of inherently asynchronous implementations for use with a REST API based communication between a client dataset and the Google Firestore backend. Classic VCL TClientDataSet operations The editing and navigation interface for a TClientDataSet is best provided by using data-aware controls such as TDBGrid, TDBNavigator and more. Still, many times you need to process some records in code according to specific business logic. When it comes to populating and modifying a TClientDataSet in classic VCL code, you would use code similar to the following code snippets. Inserting a record in the dataset ClientDataSet1.Insert; ClientDataSet1.FieldByName(‘Description’).AsString := ‘Call up a meeting with Sales group.’; ClientDataSet1.FieldByName(‘Status’).AsString := ‘New’; ClientDataSet1.Post; Modifying a record in the dataset ClientDataSet1.Edit; ClientDataSet1.FieldByName(‘Status’).AsString := ‘Done’; ClientDataSet1.Post; Deleting a record in the dataset  Processing all the records in the dataset ClientDataSet1.First; while not ClientDataSet1.EOF do begin //do some processing based on one or more fields of the record ClientDataSet1.Next; end; Equivalents with Firestore? Question is, will the above code work in Firestore ClientDataSet too? Yes the above code will work as standalone. But the code that follows the above code will fail if it depends on the success of the database operation in the previous code. This is important to understand so let’s look at 2 examples of how the code that follows can fail in Firestore TClientDataSet. Failing code example 1 Consider the following variation of the last example: if not ClientDataSet1.Active then ClientDataSet1.Open; ClientDataSet1.First; while not ClientDataSet1.EOF do begin // do some processing based on one or more fields of the record .. ClientDataSet1.Next; end; This will fail on TClientDataSet1.First. Why? Because an open is an asynchronous operation that takes time to open the cloud database. There is no guarantee that the open will be complete by the time you reach the next statement. What will happen is unpredictable. In fact, this is true of all the ClientDataSets in TMS Web Core dealing with cloud databases. Failing code example 2 Consider another example where we want to first insert a record in a Firestore collection, then get the record’s id that Firestore generates and stuff it as a foreign key value in another dataset’s new record. // adding a new customer’s record Customers.Insert; Customers.FieldByName(‘FirstName’).AsString := ‘John’; … more data for the customer record as needed … Customers.Post; // getting the generated id from Firestore newid := Customers.FieldByName(‘id’).AsString; // adding the invoice for the customer Invoices.Insert; … more data for the invoice record as needed … // setting the foreign key value as the id generated earlier Invoices.FieldByName(‘customer_id’).AsString := newid; Invoices.Post; Do you see what will cause a problem here? Customers.Post is an async operation as it will add a new record in the Firestore collection. There is no guarantee that it will finish by the time you reacth the next statement that remembers the generated id in newid.  To rescue with async Fortunately, we have a solution for the above coding problems in the new version of TWebFirestoreClientDataSet. They consist of the following methods that allow you […]

Read More

Announcing beta support for FMXLinux!

Intro We have been working on this for quite some time now and today we can proudly announce beta support for FMXLinux in ALL FNC products. Download the latest update today to get started! Below is a list of FNC products that have been tested in FMXLinux. With FMXLinux, we add a new platform to the wide variety of already supported platforms in FNC. TMS FNC Components can be used simultaneously on these frameworks TMS FNC Components can be used simultaneously on these operating systems/browsers TMS FNC Controls can be used simultaneously on these IDEs Getting Started Beta support means that the components have been tested and deployed on a Linux environment (Ubuntu 20.04) after properly setting up FMXLinux and other dependencies required for various parts of FNC. Support for FMXLinux is limited to RAD Studio 10.4 Sydney and the path to the source files has to be manually configured in the library path (the automated installer currently does not pick up FMXLinux). Please follow the instructions below to add FMXLinux support to RAD Studio. Please note that adding the SDK is an essential part of the configuration process and it is important to add the SDK to RAD Studio when all the necessary libraries are added to your Linux environment. After following the above instructions, please execute the following commands sudo apt install joe wget p7zip-full curl openssh-server build-essential zlib1g-dev libcurl4-gnutls-dev libncurses5 sudo apt-get install zlib1g-dev sudo apt install libgl1-mesa-glx libglu1-mesa libgtk-3-common libgstreamer1.0-0 libgstreamer-plugins-base1.0-0 sudo apt install libwebkit2gtk-4.0-dev Add each path that contains FNC source files of the products you have installed to the Linux 64 bit library path. Start a new multi-device FMX project and select the Linux 64 bit profile. When the PAServer is running correctly, you can connect to Linux environment and start deploying your application.  Preview We have created a short video to give you an idea on what you can expect when deploying new or existing FNC applications. Feedback! With this beta support for FMXLinux announcement we start a journey on a new and exciting road. Feedback during the beta period is highly appreciated. After a couple of updates, we’ll announce full support and further fine-tune the installation process as well as provide more videos, documentation and demos.

Read More

Firestore server-side filtering in TMS WEB Core v1.7

To create a high performance web client application, a lot of things need to be taken in account. But foremost, when you create a modern SPA (single-page-application) architecture web client application, you will want to look at optimizing the communication of the application to your database back-end. In case you use the Google cloud based infrastructure as your database back-end, you will want to perform as little as possible requests and ensure that the data involved in these requests is as compact as possible. The server-side filtering capabilities of Google Firestore allow you to easily achieve this, especially with the new built-in support for it in the TWebFirestoreClientDataSet in TMS WEB Core. Recalling loading and filtering features of TClientDataSet in classic VCL If you have used a TClientDataSet in Delphi VCL, you already know that the component provides an in-memory table that can be manipulated easily and efficiently. But if there are a large number of records in a database, loading all of them in the TClientDataSet needs to be avoided. With traditional Delphi TClientDataSet, if the records are loaded through a DataSetProvider that supports queries then you can change those queries to load limited records based on a criteria. This approach greatly reduces the memory overhead of the TClientDataSet, since fewer records need to be stored in memory.  Compare this with another option of local filters, also from standard Delphi VCL, where the number of records visible in the dataset can be reduced by using local filtering options. But that does not reduce the number of records in memory. It only restricts access to the records filtered out. In Web Core, we give a solution similar to  DataSetProvider where certain filtering criteria can be applied at the Firestore to reduce the number of records fetched on opening the dataset. New server-side filtering features in TWebFirestoreClientDataSet The new server-side filtering features purpose is to limit the number of records fetched from a Firestore collection. Consider the problem when the Firestore collection has a large number of records. Loading all of them at once is not a good idea due to the memory overhead of an in-memory table in the TClientDataSet.  In the new release of TMS WEB Core, the Firestore ClientDataSet component provides new features to apply filters to the data obtained at the Firestore end. Important background information Before we look at the details of each filtering method, it is necessary to understand some core principles. 1) Method names begin with “AddService” There are several Firestore related filtering methods available in the Firestore ClientDataSet component.  They are named starting with “AddService” indicating that they are applied at the Firestore Service level. This is to differentiate them from any local filtering methods already available in the standard ClientDataSet. 2) Firestore filters are not as flexible as SQL queries  The primary purpose of the Firestore filter methods is to limit the number of records fetched on opening the dataset in order to reduce the memory overhead.  Don’t expect the Firestore filters to be as flexible as an SQL query for your data processing requirements. There are many restrictions and limitations as you will discover later. For an exanple, please see “Limitations and Gotchas” under AddServiceFilterCondition method later in this article.  If you have advanced filtering requirements then in addition to the […]

Read More