Question of length of array in ODI

Hello

I have a problem during execution of an ODI 11 g interface.

There is a stage in my interface where it creates a unique index.
Generally speaking, it takes the name of the table and prefixes with ' I$ _ ' and suffix with "_x".
Example of my index finger is *' I$ _Tablename_x'* if the name of the table is 30 charcaters, then the name of the index will be 35 characters that are not allowed in oracle. That's why giving an error in the interface.
So I Went to topolgoy-> physical architecture--> oracle--> other and changed my name and the column name length of the table at 25.

However when I run the interface again the name of the table is stripped to 25 characters therefore giving an error "ORA-00942: table or view does not exist" that makes sense.

Please, help me to overcome this problem.

Thank you
Badin.

Hi Michael,

Thanks for your reply.
I contacted the support of Oracle and they say it's a bug in 11g, please check below note for Oracle:

Earlier on 10g we were not names of objects to be truncated if it exceeds
Backed by its respective technology, in a MAX_TAB_NAME_LENGTH
conditions.

But on 11g and same conditions we're truncating object name when it exceeds
Length MAX.

This is due to:
On 11g, the generation of object name is managed in three categories-
(SnpLSchema-> getObjectName)
1 OBJECT_NAME_LENGTH_CHECK_OLD = 0;
2 OBJECT_NAME_LENGTH_CHECK_EXCEPTION = 1;
3 OBJECT_NAME_LENGTH_CHECK_TRUNCATE = 2;
.
By default, for the getObjectName of the API, we are dealing with in the #3 category that
would cause problems for users of 10 g, the upgrade to 11 g if ObjectName here
exceeds the MAXIMUM length.

===================

following the instructions should be given to the customer in the readme file to
activate the fix
1. Select topology-> tab physical Architecture.
2. for connections of 10 g, select a dataserver and double-click it to open its Edit
window.
3 select Properties tab and enter the parameter 'OBJECT_NAME_LENGTH_CHECK_OLD' as
key and 'true' as value and record the DataServer.
4. perform the procedure using this connection and the generation of code should
be similar to 10g.

The solution does not work for me, I'm still working with oracle to get it repaired.

But if you upgrade 10g and 11g and if you use these table names to create temporary objects greater than 30 characters, then, there is a high probability you will get questions even if you set the "maximum length of array" less than 30 characters.

I'll keep you posted as soon as I get the complete solution from oracle.

Thank you
Badin.

Published by: 926363 on April 9, 2012 07:55

Tags: Business Intelligence

Similar Questions

  • Question of EBS 12 NLS language ODI

    Hello!

    We have a project with e - Business Suite 12 tables and views.

    After that we retro-design of the tables in the data of our model viewer, we have no data at all.

    No data in View.PNG

    We know that in SQL Developer, we can see data after you set the NLS language:

    NLS SQLDeveloper.PNG

    Is there something that we could ODI to display the data, after, during, or previous importation of tables?

    What do you suggest for this situation.

    Any suggestion will be highly appreciated your expertise.

    Thank you

    Ivan Lemus

    OK - we have confirmed the problem

    For a newspaper on the trigger, that you would need to talk to your EBS DBA-, they should be able to do what it is permitted in the rules of security of data organizations. This means that whenever the APPS user connects to the database, it is an automatic call to ALTER SESSION

    To do this the LKM, you add a step before read you all the data to deliver an ALTER SESSION on the SOURCE.

    My preference is to get a trigger created by the DBA

  • Question: How do the Disqualification Trigger ODI?

    Hi all

    I know to ODI with trigger Disqualification job but are threre any wat do Disqualification to trigger ODI Job?

    Kind regards

    Nathan Srisaksakul

    Assuming that the ODI jobs can be called from the command line, you can use an external task and invoke a shell script of the for.

  • QUESTION: Extracting data Essbase AND the ODI Agent installation?

    To extract the data of Essbase cubes, ODI has 'LKM Hyperion Essbase DATA to SQL'.
    We can use (1). ReportScript, or (2). An MDX query or (3). CalcScript

    For the extraction of data by using CalcScript, ODI Agent must be running on the same server as the Essbase server.

    Anyone know if there is a need for ODI Agent on the Essbase machine if we use the method of MDX query for the extraction of the data?

    We would like to avoid the installation of Agent ODI for Essbase-extraction of data.





    .

    It's just for the Calc script method because it has access to the exported file, you should be fine with the other methods.

    See you soon

    John
    http://John-Goodwin.blogspot.com/

  • Satellite MX40-231: Question about length of battery life

    What should be the duration of battery life when I use the normal power profile? and with the help of constantly internet internet and Ms word.
    I hope you can help me

    Kind regards

    Mark Holland

    Hello

    I found the same information, but I put t think you can use 4 hours. My opinion is that you can use it two hours. I recommend to set the CPU at a lower level and also check other settings like the brightness of the screen. If you set all these lower-level settings, you can save useful energy and work for long periods.

    Good bye

  • Possible to add 1, 2,..., N different buttons on the length of the array conditional?

    I have a table with 1, 2 or more items

    I want to open a dialog box of the user interface with buttons as much as my length of array.

    AND I want to be able to customize each onClick unique function() for each button was only

    The problem is that I can't do the code recognize each individual button once were created.

    How you try to create the dialog box. Here is a way.

    var myArray = ['one','two','three','etc.'];
    function myButtonOnClick(){ alert(this.text);};
    var dlg = new Window( 'dialog', 'Example' );
    for(var b=1;b<=myArray.length;b++){
        eval('dlg.btn'+b+' = dlg.add("button",undefined,"'+myArray[b-1]+'");');
        eval('dlg.btn'+b+'.onClick = '+myButtonOnClick+';');
    }
    
    dlg.show();
    alert(dlg.btn1.text);
    
  • Problem with ODI 11 g and width fixed files

    Hi all,

    I have a problem with a flat file with fixed length fields. I have reported all the correctly (it seems) and in the data preview, I see the correct data, unfortunately when I lounch my execution interface I get an error message saying that the size of the last filed is more than the declared. Looks like he is not able to understand the end of the recording is normal '0D0A '.

    And I also have another question, anyone knows why inside my ODI Desiner I see always the same file also if I try to change the data inside? What is a clearance problem or a bug? I forgot to set something up in a certain place?

    Thank you in advance.

    B.

    Could this be a problem with the last configuration of column length? Please refer to the files - 11 g Release 1 (11.1.1)

  • Flash Questions Help

    Hi all


    In a game in progress that I am, I met the problem stacked questions ontop of each other. By that, I mean I have a range of issues that are going on the issue of the buttons 1 at a time. The problem is that for each question, I answer, it also answers questions before her at the same time (thus ruining my score)... Anyone has any advice on how to fix the code below so that it won't happen?

    I have the whole game at this link: https://www.dropbox.com/s/sfopgwoyxgpq4xs/kid%20game%20may22%20cs4.fla but here is the code which originated the questions.

    I really need help as soon as POSSIBLE and thanks


    function Hitwat5(event:Event)
    {
    If (Person.hitTestObject (Watcoin5))
    {

    yScroll = 0;
    qBack5.visible = true;
    (qBack5);
    Watcoin5.y-= 1200;
    var buttons: Array = [qBack5.button15, qBack5.button25];

    questions of the var: Array = [];
    questions.push (["what is 40 divided by 5?", 1, "10", "8"]);
    Support;
    questions.push (["sides how many are there in a Pentagon?", 0, "5", "6"]);
    questions.push (["which has the same value as 3 x 4?", 1, "5 x 2", "6 x 2"]);
    questions.push (["what is missing? 17 _ plus 28? », 0, « 11 », « 9 »]) ;
    questions.push (["how many ribs is on a cube?", 0, "6", "4"]);
    questions.push (["What's 9 x 4?", 1, "32", "36"]);
    questions.push (["how much is 2 + 3 nickles worth dimes?", 0, "35cents", "25cents"]);
    questions.push (["what is 350-60?", 1, "260", "290"]);
    questions.push (["what is missing? 2 _ 4", 1, "=", "<"]);
    questions.push(["What is 23.4+20.3?", 0, "43.7", "41.5"]);

    function init(questionNum:int)
    {
    currentQuestion5 = questionNum;
    question of the var: Array = issues [questionNum].
    question [0] = qBack5.questionText5.text;
    var j: int = 2;
    correctAnswer5 = question [1];
    trace (correctAnswer5);
    for (var i: int = 0; i < buttons.length; i ++)
    {
    buttons [i] .addEventListener ("click", onClick);
    keys [i].answerText.text = [i + 2] on the issue;
    }
    }

    function onClick(event:Event)
    {
    var int index = buttons.indexOf (event.target.parent);
    trace ("buttonIndex =" + index + "right answer =" + correctAnswer5);
    If (index is correctAnswer5)
    {
    onCorrect();
    }
    on the other
    {
    onIncorrect();
    }
    }

    function onCorrect()
    {

    score += 5;
    trace ("scoreCorrect" + score);
    nextQuestion();
    }

    function onIncorrect()
    {
    score = 5;
    trace ("scoreINCorrect" + score);
    nextQuestion();
    }

    function nextQuestion()
    {
    Update();
    for (var i: int = 0; i < buttons.length; i ++)
    {
    buttons [i] .removeEventListener ("click", onClick);
    qBack5.visible = false;
    yScroll = Defaulty;
    }

    If (currentQuestion5 > = questions.length - 1).
    {
    gotoAndStop ("Menu", "Menu");
    }
    on the other
    {
    currentQuestion5 ++;
    init (currentQuestion5);
    }
    }

    function update()
    {
    scoreText.text = String (score);
    }

    Stop();
    init (0);
    }
    }


    Thank you very much

    Flash noob.


    Try:

    import flash.events.Event;

    Stop();

    var xScroll:int = 15;

    var yScroll:int = 7;

    var BeachDefaulty:int = 1;

    var ForestDefaulty:int = 300;

    var Defaultx:int = 15;

    var Defaulty: int = 7;

    var leftBumping:Boolean = false;

    var rightBumping:Boolean = false;

    var upBumping:Boolean = false;

    var Rightgo:Boolean = false;

    var Leftgo:Boolean = false;

    var leftBumpPoint:Point = new Point (460,260);

    var rightBumpPoint:Point = new Point (500,260);

    var upBumpPoint:Point = new Point (Person.x, Person.y);

    var currentQuestion5:int = 0;

    var correctAnswer5:int = 0;

    var currentQuestion10:int = 0;

    var correctAnswer10:int = 0;

    var score: int = 0;

    var scoreHigh:int = 0;

    var button: int = 0;

    Person.x = stage.stageWidth / 2;

    Beachback.x = Person.x;

    Beachback.y = BeachDefaulty;

    Forestback.y = ForestDefaulty;

    Forestback.x = Person.x;

    Watcoin5.x = (Math.random () * 833 + 9

    Watcoin10.x = (Math.random () * 833 + 9

    qBack10.visible = false;

    qBack5.visible = false;

    SUMMARY. Visible = false;

    MainMenu.Visible = false;

    stage.addEventListener (Event.ENTER_FRAME, loop);

    function loop(e:Event):void

    {

    trace (Person.y)

    Beachback.y += yScroll;

    Forestback.y += yScroll;

    Watcoin10.y += yScroll;

    Watcoin5.y += yScroll;

    Finishgame.y += yScroll;

    If (Rightgo)

    {

    Person.x += xScroll;

    }

    on the other

    {

    Person.x += 0;

    }

    If (Leftgo)

    {

    Person.x-= xScroll;

    }

    on the other

    {

    Person.x-= 0;

    }

    If (Watcoin10.y > 370)

    {

    Watcoin10.y-= 1200;

    Watcoin10.x = (Math.random () * 833 + 9

    }

    If (Watcoin5.y > 370)

    {

    Watcoin5.y-= 1200;

    Watcoin5.x = (Math.random () * 833 + 9

    }

    Hitwat10 (e);

    }

    function Goright(event:Event):void

    {

    Rightgo = true;

    }

    function Goleft(event:Event):void

    {

    Leftgo = true;

    }

    function stopGoright(event:Event):void

    {

    Rightgo = false;

    }

    function stopGoleft(event:Event):void

    {

    Leftgo = false;

    }

    function pausegame(event:Event):void

    {

    yScroll = 0;

    xScroll = 0;

    SUMMARY. Visible = true;

    MainMenu.Visible = true;

    }

    function resumegame(event:Event):void

    {

    yScroll = Defaulty;

    xScroll = Defaultx;

    SUMMARY. Visible = false;

    MainMenu.Visible = false;

    }

    function mainmenu(event:Event):void

    {

    gotoAndPlay(1,"Start");

    }

    Shiftleft.addEventListener (MouseEvent.MOUSE_DOWN, Goleft);

    Shiftright.addEventListener (MouseEvent.MOUSE_DOWN, Goright);

    Shiftleft.addEventListener (MouseEvent.MOUSE_UP, stopGoleft);

    Shiftright.addEventListener (MouseEvent.MOUSE_UP, stopGoright);

    Pause.addEventListener (MouseEvent.MOUSE_DOWN, pausegame);

    Resume.addEventListener (MouseEvent.MOUSE_DOWN, resumegame);

    Mainmenu.addEventListener (MouseEvent.MOUSE_DOWN, mainmenu);

    Watcoin10.addEventListener (Event.ENTER_FRAME, Hitwat10);

    Watcoin5.addEventListener (Event.ENTER_FRAME, Hitwat5);

    Finishgame.addEventListener (Event.ENTER_FRAME, gameEnder);

    function gameEnder(event:Event)

    {

    If (Person.hitTestObject (Finishgame))

    {

    if(score > scoreHigh)

    {

    scoreHigh = result

    }

    gotoAndPlay(1,"Start")

    }

    }

    var questions10:Array = [];

    questions10.push (["Bedmas using, what is 4 x 2 + 3?", 0, "11", "20"]);

    Hard;

    questions10.push (["what is 8 x 9?", 1, "63", "72"]);

    questions10.push (["what is missing? 28 _ 23", 1,"<", "="">"]);

    questions10.push (["which is 124 + 130?", 0, "254", "234"]);

    questions10.push (["what number is greater than 865 but less 941?", 1, "964", "893"]);

    questions10.push (["what is 76.23 + 11.3?", 0, "87.53", "84.74"]);

    questions10.push (["what is missing? 9 x _ = 81 ", 0, '9', '8']);

    questions10.push (["what number is missing? ([941, 952, _, 974 ", 0, '963', '957']);

    questions10.push (["Bedmas using, what is 3 + 4 x 4?", 1, "28", "19"]);

    questions10.push (["apples of 25 cents-how much can you buy with $4.25?", 1, "15", "17"]);

    var questionNum:int = 0;

    function Hitwat10(event:Event) {}

    If (Person.hitTestObject (Watcoin10)) {}

    yScroll = 0;

    qBack10.visible = true;

    (qBack10);

    Watcoin10.y-= 1200;

    Watcoin10.x = (Math.random () * 833 + 9;

    var buttons: Array = [qBack10.button110, qBack10.button210];

    Stop();

    init();

    }

    }

    function update() {}

    scoreText.text = String (score);

    }

    function init() {}

    question of the var: Array = questions10 [questionNum];

    question [0] = qBack10.questionText10.text;

    correctAnswer10 = question [1];

    trace ("CorrectAnswer10" + correctAnswer10);

    for (var i: int = 0; i< buttons.length;="" i++)="">

    buttons [i] .addEventListener ("click", onClick);

    keys [i].answerText.text = [i + 2] on the issue;

    }

    }

    function onClick(event:Event) {}

    var int index = buttons.indexOf (event.currentTarget.parent);

    trace ("buttonIndex =" + index + "right answer =" + correctAnswer10);

    If (index == correctAnswer10) {}

    onCorrect();

    } else {}

    onIncorrect();

    }

    }

    function onCorrect() {}

    score += 10;

    trace ("scoreCorrect + 10 =" + score);

    nextQuestion();

    It is probably wrong: removeEventListener ("click", onClick);

    }

    function onIncorrect() {}

    score = 10;

    trace ("scoreInCorrect + 10 =" + score);

    nextQuestion();

    It is probably wrong: removeEventListener ("click", onClick);

    }

    function nextQuestion() {}

    qBack10.visible = false;

    yScroll = Defaulty;

    Update();

    for (var i: int = 0; i< buttons.length;="" i++)="">

    buttons [i] .removeEventListener ("click", onClick);

    }

    questionNum ++;

    {if(questionNum==questions10.) Length)}

    gotoAndStop ("Menu", "Menu");

    } else {}

    init();

    }

    }

  • How could question about crossing of directories, be in my code?

    I would like to add several files and directories to zip archive. But the question on the crossing of directories.
    Have the structure of the following files:
             directory1:
                    directory3:
                            11.txt
                            22.txt
                            33.txt
                    directory4:
                            111.txt
                            222.txt
                    directory6:
                            555.txt
                            666.txt
                    1.txt
                    2.txt
                    5.txt
    Class with the main method:
    package main;
    
    import java.io.FileNotFoundException;
    import java.io.IOException;
    import main.zip.ZipArchiver;
    
    public class ZipTest{
        public ZipTest(){
            try{
                new ZipArchiver("directory1.zip").zip("directory1");
            }catch(FileNotFoundException ex){
                ex.printStackTrace();
            }catch(IOException ex){
                ex.printStackTrace();
            }
        }
        public static void main(String[] args){
            new ZipTest();
        }
    }
    Class ZipArchiver:
    package main.zip;
    
    import java.io.File;
    import java.io.FileNotFoundException;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.util.zip.ZipEntry;
    import java.util.zip.ZipOutputStream;
    
    public class ZipArchiver{
    
        public ZipArchiver(String zfn) throws FileNotFoundException{
            zipFileName=zfn;
            fos0=new FileOutputStream(zipFileName);
            zos0=new ZipOutputStream(fos0);
    
        }
    
        public void zip(String directory) throws FileNotFoundException,IOException{
            System.err.println("Starting zip("+directory+"):");
            System.out.println("directory="+directory);
            File f0=new File(directory);
            String[] files=f0.list();
            System.out.println("files.length 1="+files.length);
            for(int j=0;j<files.length;j++){
                System.out.println("files["+j+"]="+files[j]);
            }
            for(int i=0;i<files.length;i++){
                System.out.println("files.length 2="+files.length);
                for(int j=0;j<files.length;j++){
                    System.out.println("files["+j+"]="+files[j]);
                }
                System.out.println("files["+i+"]="+files);
    ZipEntry zipEntry=null;
    if(new File(directory+fileSeparator+files[i]).isDirectory()){
    System.out.println("Adding directory: "+files[i]);
    zipEntry=new ZipEntry(files[i]+fileSeparator);
    zos0.putNextEntry(zipEntry);
    zos0.closeEntry();
    System.out.println("zip(files["+i+"].getPath())="+files[i]);
    zip(directory+fileSeparator+files[i]+fileSeparator);
    }else{
    System.out.println("Adding file: "+files[i]);
    zipEntry=new ZipEntry(files[i]);
    zos0.putNextEntry(zipEntry);
    zos0.closeEntry();
    }
    }
    }
    public final static String fileSeparator=System.getProperty("file.separator");
    private FileOutputStream fos0=null;
    private ZipOutputStream zos0=null;
    private String zipFileName=null;
    }

    To tell the truth I can’t figure out how the recursion of directories could be here?
    Here is an out:
    Starting zip(directory1):
    directory=directory1
    files.length 1=6
    files[0]=1.txt
    files[1]=2.txt
    files[2]=5.txt
    files[3]=directory3
    files[4]=directory4
    files[5]=directory6
    files.length 2=6
    files[0]=1.txt
    files[1]=2.txt
    files[2]=5.txt
    files[3]=directory3
    files[4]=directory4
    files[5]=directory6
    files[0]=1.txt
    Adding file: 1.txt
    files.length 2=6
    files[0]=1.txt
    files[1]=2.txt
    files[2]=5.txt
    files[3]=directory3
    files[4]=directory4
    files[5]=directory6
    files[1]=2.txt
    Adding file: 2.txt
    files.length 2=6
    files[0]=1.txt
    files[1]=2.txt
    files[2]=5.txt
    files[3]=directory3
    files[4]=directory4
    files[5]=directory6
    files[2]=5.txt
    Adding file: 5.txt
    files.length 2=6
    files[0]=1.txt
    files[1]=2.txt
    files[2]=5.txt
    files[3]=directory3
    files[4]=directory4
    files[5]=directory6
    files[3]=directory3
    Adding directory: directory3
    zip(files[3].getPath())=directory3
    directory=directory1\directory3\
    Starting zip(directory1\directory3\):
    files.length 1=3
    files[0]=11.txt
    files[1]=22.txt
    files[2]=33.txt
    files.length 2=3
    files[0]=11.txt
    files[1]=22.txt
    files[2]=33.txt
    files[0]=11.txt
    Adding file: 11.txt
    files.length 2=3
    files[0]=11.txt
    files[1]=22.txt
    files[2]=33.txt
    files[1]=22.txt
    Adding file: 22.txt
    files.length 2=3
    files[0]=11.txt
    files[1]=22.txt
    files[2]=33.txt
    files[2]=33.txt
    Adding file: 33.txt
    files.length 2=6 *<------WHY THE LENGTH OF ARRAY files =6 AGAIN?*
    files[0]=1.txt
    files[1]=2.txt
    files[2]=5.txt
    files[3]=directory3
    files[4]=directory4
    files[5]=directory6
    files[4]=directory4
    Adding directory: directory4
    zip(files[4].getPath())=directory4
    Starting zip(directory1\directory4\):
    directory=directory1\directory4\
    files.length 1=2
    files[0]=111.txt
    files[1]=222.txt
    files.length 2=2
    files[0]=111.txt
    files[1]=222.txt
    files[0]=111.txt
    Adding file: 111.txt
    files.length 2=2
    files[0]=111.txt
    files[1]=222.txt
    files[1]=222.txt
    Adding file: 222.txt
    files.length 2=6
    files[0]=1.txt
    files[1]=2.txt
    files[2]=5.txt
    files[3]=directory3
    files[4]=directory4
    files[5]=directory6
    files[5]=directory6
    Adding directory: directory6
    zip(files[5].getPath())=directory6
    Starting zip(directory1\directory6\):
    directory=directory1\directory6\
    files.length 1=2
    files[0]=555.txt
    files[1]=666.txt
    files.length 2=2
    files[0]=555.txt
    files[1]=666.txt
    files[0]=555.txt
    Adding file: 555.txt
    files.length 2=2
    files[0]=555.txt
    files[1]=666.txt
    files[1]=666.txt
    Adding file: 666.txt

    Edited by: user124 on Oct 19, 2011 6:13 PM

    deleted
            if(directory.endsWith("directory1\\tmp")){
                zos0.close();
                fos0.close();
            }
    It's in the previous version.

    I thought that when I create a new instance of table files, more former precipitates with garbage collector automatically.

    Calling the method retains its local variables until it returns. So if there are recursive calls N of the method copies the variable N in the existence at the same time. When each of them returns, its local variables are released (to simplify).

    You can just tell me this error instead of writing of the unnecessary words (sorry if you offend).

    A ridiculous (and shocking) statement. You assume that people can read your mind to see what wrong thoughts are inside. I give you the right answer, for the third time, and you are accusing me of writing of the unnecessary words. You're the one who writes lyrics that are unnecessary here.

  • Management of metadata in ODI/planning errors

    I debated between this question on the forum of the ODI or here, but just like the famous John Goodwin so dominates this forum, I thought I'd post it here. :)

    How people treat the planning dimension builds in ODI wrt in error handling packages?

    My goal is only to send emails from the exception when a problem arises. I automate this via packages compiled for scenarios.

    I found that a real error in an interface will cause a recoverable error in one package, for example, the name of the server is really plan01.corpname.com and somehow the physical schema gets changed to bozotheclown.goaway.org. I can then send an email to failure.

    I also found that if I have an error of metadata in a dim planning build interface I can intercept the errors in an error file. A wrong record (syntactically correct, but its parent cannot be found, for example) will generate an entry in the error file if I turn record errors.

    However, this record incorrect do not generate an ODI error in a package.

    I thought to test the existence of this file but the generation constant (from the option LOG_ERRORS IKM SQL for Hyperion Planning) of the error file regardless of how shabby record that I can't use the control ODIFileWait to test if the file is there or not.

    I can't find a way to test for the length of the file (if it is zero, there is no metadata errors) in ODI.

    I guess I could do it via an external script (Windows environment), but it's wrong on many levels that I can't believe this is my only option.

    Any thoughts? If you come with an answer, I'll post in my blog and give you all the credit. As if it was a real incentive...

    Kind regards

    Cameron Lackpour

    All this hard work and you don't even give me the points ;) only joke he doesn't bother me.
    It's a very good question you raised and certainly necessary covering and thanks for all the praise.

    See you soon

    John
    http://John-Goodwin.blogspot.com/

  • changing/variable index of an array on FPGA

    Hi all

    I have a question about indexing an array on FPGA. Concretely, I have a constant size 1 M table and want pieces of index of size N of it. Unfortunately, when you try to compile I get the error message: the tables with variable sizes running are not supported. Is there a work-around nice for who?

    See you soon

    Hello

    Well, I don't have first play dynamicaly with the Index of the Array of subset function entry.

    This is not supported in a SCTL, so that the planned behavior.

    There are several workaround solutions to do this, depending on how you design your design.

    1 point by Point approach (as usually made it in FPGAs), using a function table of Index on the RefArray and with the use of counters to keep track of the Index, and evantualy count each sample collected.

    This means that every cycle, you have an example that needs to be addressed, you don't work with a tableau more out.

    2. same as 1, but using a BRAM I32 element as an interface in the screenshot gave you, I understand that your table with a value of several KBs, which can be a problem in the long term for your design.

    3. using a FPGA IP, you could build something like this:

    You can use a loop in the context IP FPGA that auto-index the RefArray, to pick up the samples you want, in your sub-table.

    This means that you can always work with a table in the output, but the cost will be that you can not leave the subarray in each clock cycle. (use the estimate feature to see the actual flow rate)

    4. you can explicitly implement a big MUX, using a box structure. In each case, you provide the desired sub-table.

    This is indeed what LV FPGA would do if you where using a standard while loop. Yes, ugly, but no way around it if you want a sub-table, at every clock cycle.

    5. the BRAM/DRAM can work with an interface of up to 1024 bits, 32x32bits elements for ex, then you might have used up to 32 items in you case (using the loose I32)

    So! In your case, I recommend that you use option 5 if possible:

    -Think of BRAMs, your table is starting to get impatient on slices

    -Use up to an interface of 1 024 bits on BRAM for a sub-table, do you really need more of 1024 bits a sub-table?

    If you don't see how to go from there, I would need more information on what you try to do + all necessary and upstream of the stored data and their data type

    Good bye

  • Extract a variable number of bits of byte array

    Hello

    I was working on the decoding of a binary file and one of the tasks is to extract data from a fixed-length U8 array variable bits. The image below is a simple illustration of this particular task.

    Now, before you post you solution, I have already examined 2 methods of forum I searched so far, here is the following excerpt from a simple example of code.

    So 2 of the U8 data array element, I extract the 3, 9, and 6 bits of the data in this table and place it in another table (for simplicity).

    However, I believe that these 2 methods may not be effective in terms of speed and memory performance.

    I would like to know if there is than other alternatives to solve this problem. If so, share with us.

    Thank you.

    Kind regards

    NGO Lim Ee

    I'm here with GerdW.  If you have a set of data block (blocks of 8 or fewer), read like a U64 data and then make a few little shifting and masking with ANDS to recover your data.

    But looking at your two methods, you can not remove it use the table since this is an expensive process.  Instead, use the subset of table and keep track where you are in the table with an another shift register.  Who would avoid some memory allocations and expedite method 2.

  • FPGA loop timing and data transfer question

    Hello community,

    two really matter of rookie on FPGA timing loop. Attached a screenshot of the data acquisition loop I created. The different modules have different maximum sampling rates, then what will be the speed of the loop? It will adjust to the slower module, or can I use a timer loop?

    It's the loop of the acquisition, but I need to treat the data as well. Currently I transmit the data to the processor loop through which fixed the length of array FXP. I guess the best would be to use a FIFO. Can you confirm this? Or I should use something else?

    Thank you!

    Yes, loop rate will be determined by the slowest module. If you have some really slow analog input module, you might want to put in a loop for your fast IO. You can always put calendar information in your loop to display your real rate of loop using a shift register, subtract and a number of cycles VI.

    You're right - without loss of high speed data acquisition (without losing all the data points), you must use FIFOs. If worry about missing points data (i.e. only interested in current value), then the front panel indicator reading is fine.

  • Convert a U8 array to a data type of LabView

    In my code, the entrance is a fixed-length U8 array reflecting the data in memory, I need to convert it to a predefined data type. For example, the first 2 elements U8 in the arrary must comvert a U16, then 4 U8 U32 data elements data. I wonder if there is an easy way to do this kind of conversion.

    Type casting Man and his trusty Sidekick Unflatten chain are itching for action.

    Use Unflatten chain if you have problems with "endianness".

  • Initialization of an array to match another size of array using the formula node.

    I want to get a few different pictures of the same length and constants in the formula node and output a table corresponding to their length after some minor calculations. Another post, I discovered that I can simply initialize the table as such:

    float pp [100];

    The problem is that I find myself with a much bigger picture than what I need. I want to do is something like:

    float [n] pp.;

    where n represents the entry of an array size in the form node or is something like:

    n = sizeOfDim(td0,0);    Here I use a table 1 d

    None of these methods seem to work. How do I initialize my picture 'pp' such that it matches the length of array 1 d of "td0?

    The more likely your initialization externally.  Create an entry named pp and wire td0 inside as well.  Now create an output with the pp even name and it will contain an array of the desired length.  Of course, this assumes that you want to edit all items in pp.  Otherwise, just use initialize the array to create a new table and feed in the length of td0, and whatever default value you want (ie. 0 or NaN).  The blank values will keep this value after the node of the formula.

Maybe you are looking for