How to Programmatically Access Stored Data Values

by Janet Albers | Updated: 01/13/2016 | Comments: 16



Search the Blog

Subscribe to the Blog

Set up your preferences for receiving email notifications when new blog articles are posted that match your areas of interest.

Area / Application

Product Category


Corporate / News

Enter your email address:

Suggest an Article

Is there a topic you would like to learn more about? Let us know. Please be as specific as possible.

Leave this field empty

All Access Pass

After you store measurements and other data in your data logger’s tables, how do you access that data to perform operations in your CRBasic program? Where can you get an all-access pass to your data? This article will explain how you can use a special CRBasic syntax to simplify the coding of your program to access your data and perform various operations.

DataTable() Structure

Typically, programs written for Campbell Scientific data loggers use one or more data tables to store measurements, calculations, and variable states. The rows of a data table are called records, and the columns are called fields.

Table with field names and record

The tables in which the data records are stored are defined by DataTable()/EndTable instructions, as well as by output processing instructions. Here is an example of this type of definition:

Data Table definitions

CRBasic Syntax

After the data is stored in tables, you can access it using a special CRBasic syntax that follows this form: TableName.FieldName. This syntax accesses the value stored in a specific field of a specific table. Optionally, you can append the syntax with a field name index and records back using this format: TableName.FieldName (FieldName Index, Records Back).

Note: When Records Back = 1, you are accessing the most recent record.


This example shows how to use the CRBasic syntax to take some data (yesterday’s maximum air temperature), which is stored in a data table, and write it to a Public variable named YesterdayMaxAirTemp. To do this, use the syntax YesterdayMaxAirTemp = Daily.AirTemp_Max,where Daily is the TableName, and AirTemp_Max is the FieldName.

Your DataTable() might look like this:

DataTable() program code

Additionally, to calculate the change in average air temperature over the previous seven days, your expression would look like this:

                AirTempDiff = Daily.AirTemp_Avg(1,1) – Daily.AirTemp_Avg(1,7)

More Information

You can find more information about additional data table syntaxes, as well as programming examples, in the CRBasic Editor. Follow these steps to access this resource:

  1. In the CRBasic Editor, click the Help option in the menu bar across the top.
  2. In the drop-down menu, select CRBasic Editor Help.

    CRBasic Editor Help

  3. In the left-hand pane, click the Index tab, and type DataTable access in the keyword box.
  4. Click overview to access the full list of syntaxes.

    Data Table Access syntax options

  5. You can click each syntax option to learn more.
    1. After you click an option, a window opens.
    2. In the window, click the Example link.
    3. A smaller window opens with an example program that uses the syntax.

I hope this article has helped you discover an all-access pass to your data. By using the CRBasic syntax to simplify your coding, you should be able to easily access and use your stored data. If you have any questions or comments, feel free to post them below.

Share This Article

About the Author

janet albers Janet Albers is a Senior Technical Writer. She'll share tips, simplify concepts, and guide you to a successful project. She's been at Campbell Scientific, Inc. longer than the CR1000, but not quite as long as the CR10X. After work hours, Janet enjoys the outdoors with her boys and dogs.

View all articles by this author.


Ira | 01/13/2016 at 10:43 AM

A subtle, but important distinction to note is that FieldName doesn't necessarily equate to the variable name, which is illustrated in the examples above. The programmer should be cognizant of whether "_Max", "_Min", "_Avg" or another appendage is necessary to completely describe the FieldName.

Curt_Ingram | 01/15/2016 at 10:03 PM

I absolutely love the blogs that you post Janet!  Keep it up :)  

jra | 01/18/2016 at 08:17 AM

Right Ira. A variable name often is part of the FieldName but they are not (usually) the same. 

Thanks Curt! Let me know if you have suggestions for other topics. 

Curt_Ingram | 02/22/2016 at 08:30 PM

Janet, I would love a writeup on how to "properly" program events based on monthy or yearly change.  For example, I would like my datalogger to keep up with monthly kWhr usage.  For this to work for me now, I have to remember to reset to 0 each month (which I never do) :) 

jra | 02/23/2016 at 08:53 AM

Hi Curt! Starting with OS 28 the TimeIntoInterval() and DataInterval() instructions have a MONTH option. A line in your program, after your CallTable(), like this:

If TimeIntoInterval (0,1,Mon) Then Total_kWhr = 0

should do the trick.


The MONTH option is a little different than our other intervals. When using MONTH as the interval, the TIME INTO parameter is in seconds. Here’s a link to the change log description


If you are using an older operating system the technique in this forum post: uses RealTime() to accomplish the same thing.


I hope that helps.

Let me know what other questions you have.

Curt_Ingram | 02/29/2016 at 09:01 AM

Yay!  Thanks Janet! 

minida28 | 02/27/2020 at 02:44 PM

Hi Janet,

I work a lot with data coming from serial or modbus. And often time, the data I received already have their own "real" timestamp. If I call the datatable to store those data, I endup having a datatable with inaccurate timestamp.

Is there a way so that when I call the data table to store the readings, I can instruct the datatable to use the "real" timestamp coming with the data, and not using the timestamp from the scan?

Thanks Janet, really appreciate your enlightenment in advance.

jra | 02/27/2020 at 03:36 PM

Your datatable will always store timestamps and record numbers. You have more control over your data files when using the TableFile() instruction. Take a look at, and test, the Options available. Start with Option 10 (TOA5, Header, Record#). 

Or, from the LoggerNet Connect window you can use Custom Collect. In the Format Options area clear the "Include Timestamp" check box. 

I hope that helps. 

Makada | 05/05/2020 at 03:46 AM

Hi Janet,

May i ask you the following?:

When i use the "Tablename.fieldname" expression, for example "minute_avg_WS_kph = Table1.WS_KPH_S_WVT(1,1) , and have public data from it, "public minute_avg_WS_kph", then the actual value from the table1 "WS_KPH_S_WVT" is the same as the public minute_avg_WS_kph. So far so good.

But as soon as i make a sample data from the "public minute_avg_WS_kph" in table1, " Sample(1,minute_avg_WS_kph,IEEE4,False)", the output from the sample data from table 1 is one minute late (table1 is a one minute table) compared to the same data from the Table1.WS_KPH_S_WVT ...

With kind regards,


jra | 05/05/2020 at 12:20 PM

Thanks for your question Mark. This is being answered on our User Forum 

JLomas | 07/14/2020 at 10:12 AM

Hello Janet, I have a very basic question. I have multiple sensors recording data to a single DataTable. If I modify this table, eg. adding more sensors, will I lose some data? The more general question would be: which criteria should I use when creating DataTables? Everything that requieres the same recording period should go together? I understand that DataInterval helps me saving space related with timestamps, but I'm worried about "safety" when modifying DataTables. Thanks in advance.

jra | 07/14/2020 at 10:47 AM

JLomas - always collect data before making changes to the program. You will lose data on the data logger but not data that has already been copied to your computer. 

The best way to store data depends on how you are going to use it. If it makes it easier for you to do your job to store everything with the same record period in one table then that's what you should do. If it makes it easier for you to do your job to have all data of one type (for example all temperatures) in a table then you can do that; and put all, for example water levels, in another table. 

Does that help? 

bassel | 02/27/2021 at 06:28 AM

Hi .. I'm Basel .. Can I open a program that already exists on thedatalogger RC1000 by Loggernet .. The program is later CR1 .. And can I modify in the parameters .. Example: Modify the unit of measurement of wind speed from km to m.

Thank you

jra | 03/01/2021 at 07:41 AM

Based - yes, you should use the CRBasic editor (included with LoggerNet) to make changes to the program. For more information see this tutorial. To change the units of a measurement you will likely need to change the multipler and offset in the measurement instruction. Also see the manual for that sensor. 

scg8 | 04/27/2021 at 07:20 AM


Thank you very much for the blog. I would like to ask, in my case, I have a TDR200 connected to a CR1000x, I need to send the data by RS232, however, being data frames of more or less 10,000 fields, it arrives incomplete. Do you have any idea how I can improve this?

Public OutStringCable1$ As String * 65535
TDR Code and Datatables
GetRecord (OutStringCable1$,Cable_1,1)
'Send it out the serial port
SerialOut (COMRS232,OutStringCable1$,"",0,10000)

jra | 05/10/2021 at 09:04 AM

scg8 - Thank you for your question. To provide you with the best technical support for your application, please visit to find your local Campbell Scientific office.

Please log in or register to comment.

We're active on social media!
Stay informed with our latest updates by following us on these platforms: